最近园子里网络爬虫很火爆,从 PHP 到 Python,从 windows服务 到 winform 程序,各路大神各显神通。小弟也献下丑,从平庸流出发,简述下 WebApi +AngularJS 方式实现网络爬虫。
AngularJS,创建SPA(单页面应用)。爬虫需要长时间的等待服务器返回结果,必须使用ajax实现,使用JQuery一样可以做到。
WebApi。AngularJS 配合 WebApi 使用十分融洽。
a. Abp,最近园子里很火的基础框架,最大的优点是分模块的实现,包括 AppService(WebApi) 层的分模块,使用后,代码结构非常清晰。详细内容可以见 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
b. 苏飞论坛的 C#HttpHelper万能框架 ,用于Html页面的采集,可以直接使用『HTTP代理』读取,这点很重要!
需要注意的一点是,这个框架不是免费的,需要成为年费会员才可以下载。
c. Ivony的Jumony库 ,项目介绍:“Jumony Core首先提供了一个近乎完美的HTML解析引擎,其解析结果无限逼近浏览器的解析结果。支持CSS3选择器。”
这个百度就行,可以搜索到一大堆的提供 Http 代理网址的网站,首先将这些免费的Http代理抓取大自己的代理库,第二步和第三步需要用到这些代理。使用时,要记录代理的可用情况,设定策略,失败次数过多时,剔除掉。
当然,土豪直接购买收费的代理即可,稳定性高。
下面是我抓取的代理列表:
被禁的代理(我设定策略是失败次数大于成功次数3次,即抛弃):
有了足够的Http代理列表后,就可以抓取网页了。
后端实现功能:使用 HttpHelper 挂代理抓取网页,然后使用 Jumony 分析页面内容。同时要记录每个 Http 代理的成功/失败情况。
前端控制流程:根据 代理抓取的结果,判断是否抓取成功。如果成功,继续下一个页面的抓取;如果失败,换个代理继续抓取当前页。
由于文章列表不会太多,用单线程抓取足够了。
上图:
通过第二步抓取到了大量未读取内容的文章后,这时候就需要抓取文章内容了。由于量比较大,通过多线程实现。
所谓的多线程,就是通过 Ajax 同时调用多个 WebApi 进程,通过监控返回结果。
上图:
点击『开始读取』后
点击『停止读取』后:
没有用到什么高深的知识,高深的部分都被 AngularJS、Abp、HttpHelper、Jomony实现,因此是平庸技术流的实现。
以上。