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
{
/// <summary>
/// 过期时间,单位毫秒
/// </summary>
public int Timeout { get; set; }
public WebClientEx(int timeout)
{
Timeout = timeout;
}
/// <summary>
/// 重写GetWebRequest,添加WebRequest对象超时时间
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
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上获取,和苏飞的一模一样的,哈哈。
RestSharp
同样一个强大的第三方类库,笔者接触到的是这个类库,用于调用WebAPI接口非常方便,在SM.MS图床调用上也简单介绍到,其在github上开源,星级很多,文档超详细的一个类库,很值得学习。
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<int, int, string> action = (i, n, s) =>
{
this.lblDownLoadInfo.Text = $"正在下载的是第【{i}】/【{n}】个文件\r\n文件名为:{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培训班吧,学完就可以自己做个网抓程序爬想要的数据了。
而笔者却恰好相反,虽然简单的网抓已经会了,但一直没有信心真正自己能够学着够自己所用,能够写出爬到自己想要的数据的程序。
网络爬虫和反爬虫,是一股正邪交锋的战场,在笔者2011年左右玩VBA爬虫,和如今炙手可热全民爬虫的环境已不同,普通爬虫程序已经没有什么可作为了,也就是说,参加了那些培训班速成出来的,也只能呵呵了。
无利益关系推荐一款良心爬虫工具
笔者过往也玩过爬虫工具,如火车头、火车浏览器、八爪鱼、码栈等等,也“浪费”不少时间在其中学习(在前公司里购买过一些产品,有到期不能用,当然也有现在永久离职不能用了)。
而这片免费鸡肋功能,一路指向收费买单的中国市场里,有一款工具,作者持之以恒地付出开发、维护、文档编写、视频制作等工作,最终真正地免费给大家用,真是物以类聚,Excel催化剂这样的情怀,必须顶作者,支持作者一下。
工具名称:hawk,自行百度、github获取工具安装包和教程资料。
结语
以上啰嗦了这么多,希望此文真心能够带给广大想学习网抓的朋友们一些指引,特别是想在VSTO上实现网抓的,或者直接清醒过来,不再被收智商税,选择一款现成的工具作起点,站在巨人的肩膀上使用网抓。
技术交流QQ群
QQ群名:Excel催化剂开源讨论群, QQ群号:788145319
关于Excel催化剂
Excel催化剂先是一微信公众号的名称,后来顺其名称,正式推出了Excel插件,插件将持续性地更新,更新的周期视本人的时间而定争取一周能够上线一个大功能模块。Excel催化剂插件承诺个人用户永久性免费使用!
Excel催化剂插件使用最新的布署技术,实现一次安装,日后所有更新自动更新完成,无需重复关注更新动态,手动下载安装包重新安装,只需一次安装即可随时保持最新版本!
Excel催化剂插件下载链接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q
取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。
最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!
关于Excel催化剂作者
姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)
技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。
擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。
2018年开始职业生涯作了重大调整,从原来的正职工作,转为自由职业者,暂无固定收入,暂对前面道路不太明朗,苦重新回到正职工作,对Excel催化剂的运营和开发必定受到很大的影响(正职工作时间内不可能维护也不可能随便把工作时间内的成果公布于外,工作外的时间也十分有限,因已而立之年,家庭责任重大)。
和广大拥护者一同期盼:Excel催化剂一直能运行下去,我所惠及的群体们能够给予支持(多留言鼓励下、转发下朋友圈推荐、小额打赏下和最重点的可以和所在公司及同行推荐推荐,让我的技术可以在贵司发挥价值,实现双赢(初步设想可以数据顾问的方式或一些小型项目开发的方式合作)。
Excel催化剂开源第41波-网抓网络采集类库及工具分享的更多相关文章
- Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术 Excel催化剂 2019.01.12 14:10* 字数 2948 阅读 41评论 0喜欢 0 编辑文章 在Excel催化剂的几大 ...
- Excel催化剂开源第22波-VSTO的帮助文档在哪里?
Excel催化剂开源第22波-VSTO的帮助文档在哪里? Excel催化剂 2019.01.12 14:10 字数 2930 阅读 55评论 0喜欢 0 编辑文章 对于专业程序猿来说,查找文档不是 ...
- Excel催化剂开源第36波-图片Exif信息提取,速度超快,信息超全
Excel催化剂在文件处理方面,功能做到极致,但其实很大功劳都是引用一些开源社区的轮子库,不敢独占好处,此篇给大家分享下抓取图片的Exif信息的好用的轮子. 此篇对应的Excel催化剂功能实现:第83 ...
- Excel催化剂开源第35波-图片压缩及自动旋转等处理
Excel催化剂在图片处理方面,也是做到极致化,一般的Excel插件插入图片是原图插入或不可控制压缩比例地方式插入图片至Excel当中,但Excel催化剂的插入图片,是开发了可调节图片大小的插入方式, ...
- Excel催化剂开源第34波-SM.MS图床API调用(用POST上传multipart/form-data内容)
日常做网抓数据,都是以GET请求为主,偶尔遇到需要POST请求的,一般POST的参数只是一串字符串就可以了,通过构造字符串也很容易完成,但此次SM.MS的API接口要求是Content-Type: m ...
- Excel催化剂开源第51波-Excel催化剂遍历单元格操作性能保障
在Excel催化剂推出的这一年多时间里,经常性听到一种声音,大概意思是真正会写代码的人,都不会看上Excel催化剂写出来的功能,自己造一个更舒服贴心,仿佛会一点VBA就可以天下无敌一般,也好像Exce ...
- Excel催化剂开源第50波-Excel与PowerBIDeskTop互通互联之第四篇
答应过的全盘分享,也必承诺到底,此篇PowerBI功能分享的最后一篇,讲述如何导出数据模型的元数据,笔者定义其为模型的数据字典. 此篇对应功能实现出自:第6波-导出PowerbiDesktop模型数据 ...
- Excel催化剂开源第49波-Excel与PowerBIDeskTop互通互联之第三篇
在PowerBIDeskTop开启的SSAS服务,和Sqlserver所开启的一个本质的区别是,前者其端口号是随机生成的,即上一次打开获得的端口号,下一次关闭后再打开,系统分配给它新的端口号,而后者因 ...
- Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
当国外都在追求软件开源,并且在GitHub等平台上产生了大量优质的开源代码时,但在国内却在刮着一股收割小白智商税的知识付费热潮,实在可悲. 互联网的精神乃是分享,让分享带来更多人的受益. 在Power ...
随机推荐
- 笔记:认识.NET平台
认识.NET平台先了解一堆技术术语和缩写 http://www.cnblogs.com/dbycl/p/6419456.html 天生不跨平台的.NET Framework 2.大家都来开发新语言 3 ...
- 全部的Windows消息对应值
以下是全部的Windows消息, 对于未在MSDN上的消息的WPARAM, LPARAM参数解释正确的给分 [已知 :0x0313, 0x01e2, 0x01e5, 0x01e ...
- 使用pjax实现类似github无刷新更改页面url
pjax=pushState+ajax,相信用过github的同学都知道,github部分页面采用了pjax这个项目来实现ajax无刷新加载的同时改变页面url.一起来学习一下这个插件吧. 我们都知道 ...
- ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...
- kubernetes实战篇之为默认账户创建镜像拉取密钥
系列目录 上一节我们分别使用纯文本账户密码和docker的config文件一创建一个kubernetes secret对象,并且把它添加到containers的imagePullSecrets字段用以 ...
- Storm 学习之路(一)—— Storm和流处理简介
一.Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架,可以以简单.可靠的方式进行大数据流的处理.通常用于实时分析,在线机器学习.持续计算.分布式RPC.ETL等场景.Storm具有 ...
- ASP.NET Core Web API中使用Swagger
本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger 在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...
- 理论+实践解析“IT治理”之模式与原则
IT治理工作作为企业信息化建设的上层建筑,扮演着及其重要的角色.本文结合作者的学习及实践经验给出一些借鉴. 一.IT治理概述 1.1 何为IT治理 在企业信息化建设中的最大问题,往往不是技术问题,也不 ...
- JavaScript 基础知识 变量与数据类型
一.区分大小写 JS中一切(变量/函数名/操作符)都是严格区分大小写的 二.标识符 变量.函数.属性的名字以及函数的参数 命名规则:1.第一个字符可以是字母.下划线.美元符号$ 2.其他的字符可以是字 ...
- java虚拟机-简介
一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...