Excel催化剂开源第41波-网抓网络采集类库及工具分享

在VBA开发网抓程序中,会用到xmlhttp/winHttp.winHttprequest.5.1等组件,当时笔者也是这样进入了网抓领域的,这些都是非常过时的东西,在.Net的开发中 , 有大量的更好用的轮子使用,在Excel催化剂开发过程中,也会用到,在此向大家简单分享,希望对VBA转VSTO开发群体有所帮助 。
微软原生自带类库
HttpRequest类库
在.Net4.0的框架上,只能用这个类库,在更高的框架.Net 4.5中,可以用HttpClient,比HttpRequest更高级的更易使用 。
HttpRequest应该可以满足大部分的网抓的提交需求,网上大量的教程 , 但笔者几乎不用,后面会说到原因 。
HttpClient类库
这个因为Excel催化剂项目是基于.Net 4.0的(顾及一部分用户仍然使用win7系统,win7没有sp1补丁安装不了.Net 4.5,当然更老的XP系统最高只能.Net 4.0了) , 没有福气使用它,也没有深入学习研究 。
WebClient类库
如果对网页访问要求不高,不需要做过多的cookie处理、refer页面、header头伪装等操作,单纯地只是访问下网页,返回结果即可,可以考虑用此类库,简单易用,是HttpRequest的更抽象的封装 , 几个方法即可返回想要的结果 。
因为WebClient没有超时选项设置,默认的超时时间太长 , 好像是60秒,如果需要设置超时时间 , 可以简单继承一下此类,自己封装一个类库出来 , 如下面代码 。
public class WebClientEx : WebClient { ///
/// 过期时间,单位毫秒///public int Timeout { get; set; } public WebClientEx(int timeout) { Timeout = timeout; } ////// 重写GetWebRequest,添加WebRequest对象超时时间////// /// protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); request.Timeout = Timeout; request.ReadWriteTimeout = Timeout; return request; } }
第三方类库
对Excel催化剂这种业余选手来说,天生喜欢找别人做好的轮子,微软造得不够易用,就有其他开发者在其基础上做封装,做更简单的轮子出来,所以这也是VBA转VSTO的一大优势,可以用上专业程序员世界的大量轮子,而VBA几乎没有什么轮子可用,只有零散的一些小代码片段 。
苏飞的httpHelper
这个类库是笔者一开始学习C#和在C#上学习网抓的第一个类库 , 可能现在已经迭代了好多版本了,网址是这个 , 自己有兴趣可以再了解 。http://www.sufeinet.com/
它网站上有详细的使用教程,同样基于原生的HttpRequest,但使用起来比原生的简单好多 。因为笔者偷懒使用它,所以就没有使用过HttpRequest 。
同样地,现在使用它 , 我都是用的是我以前学习nuget封装时上传到nuget的一个版本,有兴趣的也可以直接从nuget上获取,和苏飞的一模一样的,哈哈 。


Excel催化剂开源第41波-网抓网络采集类库及工具分享



直接从Nuget上就可以获取到封装好的苏飞版httphelper
RestSharp
同样一个强大的第三方类库,笔者接触到的是这个类库 , 用于调用WebAPI接口非常方便,在SM.MS图床调用上也简单介绍到,其在github上开源 , 星级很多,文档超详细的一个类库,很值得学习 。


Excel催化剂开源第41波-网抓网络采集类库及工具分享



Github上的RestSharp
HtmlAgilityPack类库
此类库对于解释html页面特别好用,类似于python的Beautifulsoup4那样,可以将网页的html格式,转换为xml格式,使用xml查询语言xpath去结构化地访问网页内容,对于非WebAPI返回的json、xml数据结构的网页特别好用 。
所以不要总以为python搞网抓多方便 , 在.Net世界里,对于一些普通小网抓,比python还好用得多 。
像xml文件 , 在.Net里,可以用linq to xml来访问,也是非常简单易用的 。相对来说,python这样的所谓流行语言 , 不一定能够比得上 。
Excel催化剂文件下载功能
最后,老规则,附上真实完整的Excel催化剂代码 , 此代码为文件下载功能,简单使用WebClient类库去实现,对其封装了一下,增加超时功能 , 同时使用了异步的方式调用,不卡界面 。
private async void btnOK_Click(object sender, EventArgs e) { var markColor = Utilities.RangeUtility.GetMarkColorToDstRange(srcDataValues); int totalNum = srcDataValues.Count(); int iLoop = 0; int rowOffset = int.Parse(this.cmbRowOffset.Text); int colOffset = int.Parse(this.cmbColOffset.Text); foreach (var item in srcDataValues) { iLoop; string srcFilePath = item.Value2.ToString(); string dstFilePath; Excel.Range dstItemRange = item.Offset[rowOffset, colOffset]; if (dstItemRange.Value2 != null) { dstFilePath = dstItemRange.Value2.ToString(); //没有后缀名时 , 标红颜色返回让用户自行检查 if (string.IsNullOrEmpty(Path.GetExtension(dstFilePath))) { item.Interior.Color = ColorTranslator.ToOle(markColor); dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor); } else { WebClientEx webClient = new WebClientEx(3000); Uri uri = new Uri(srcFilePath); await webClient.DownloadFileTaskAsync(uri, dstFilePath); //线程间操作无效: 从不是创建控件的线程访问它 。处理方法 Action action = (i, n, s) => { this.lblDownLoadInfo.Text = $"正在下载的是第【{i}】/【{n}】个文件rn文件名为:{s}"; }; Invoke(action,iLoop, totalNum, dstFilePath);if (this.IsCreateHyperLink) { dstItemRange.Hyperlinks.Add(Anchor: dstItemRange, Address: dstFilePath, TextToDisplay: dstFilePath); } } } else//当目标单元格没有值时,标红颜色返回让用户自行检查 { item.Interior.Color = ColorTranslator.ToOle(markColor); dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor); } } MessageBox.Show("下载完成!"); Action actionColseForm = () => { this.Close(); }; Invoke(actionColseForm); }
真的估计自己从头开始写网抓程序吗?
大部分的业余开发者 , 或者还不是开发者,都很想学个两招网抓,特别是python的虚火刮遍大江南北时,仿佛不会一点网抓都跟不上时代了 , 然后被煽情到数据时代人人都要会网抓 , 来参加某某python培训班吧,学完就可以自己做个网抓程序爬想要的数据了 。
而笔者却恰好相反,虽然简单的网抓已经会了,但一直没有信心真正自己能够学着够自己所用 , 能够写出爬到自己想要的数据的程序 。
网络爬虫和反爬虫,是一股正邪交锋的战?。诒收?011年左右玩VBA爬虫 , 和如今炙手可热全民爬虫的环境已不同 , 普通爬虫程序已经没有什么可作为了,也就是说,参加了那些培训班速成出来的,也只能呵呵了 。
无利益关系推荐一款良心爬虫工具
笔者过往也玩过爬虫工具 , 如火车头、火车浏览器、八爪鱼、码栈等等,也“浪费”不少时间在其中学习(在前公司里购买过一些产品,有到期不能用,当然也有现在永久离职不能用了) 。
【Excel催化剂开源第41波-网抓网络采集类库及工具分享】而这片免费鸡肋功能 , 一路指向收费买单的中国市场里,有一款工具,作者持之以恒地付出开发、维护、文档编写、视频制作等工作,最终真正地免费给大家用 , 真是物以类聚 , Excel催化剂这样的情怀 , 必须顶作者,支持作者一下 。
工具名称:hawk,自行百度、github获取工具安装包和教程资料 。
结语
以上啰嗦了这么多 , 希望此文真心能够带给广大想学习网抓的朋友们一些指引,特别是想在VSTO上实现网抓的,或者直接清醒过来,不再被收智商税,选择一款现成的工具作起点,站在巨人的肩膀上使用网抓 。

相关经验推荐