用Webmagic和MongoDB实现的通用化爬虫框架
2020-03-05 20:49
1531 查看
可忽略的小背景
- 我在第一家A公司的时候接触过通用化的爬虫框架,其中,下载,URL管理,启动爬虫任务,抽取都是自己团队实现的,一向喜欢开源和对比的我接触到了Webmagic,发现它只要实现一个PageProcessor,传递URL处理解析就可以了。
- 后来我在B公司从事亚马逊网站的爬虫工作,用Webmagic+Spring+MySQL+MyBatis+Redis实现的,其中用到了Spring的IOC,AOP,Scheduler等组件,用Scheduler定时任务去控制怎么启动Webmagic的Spider及传递URL,把亚马逊网页中我们关注的业务进行全量爬和更新爬。爬亚马逊的难点在怎样调度代理IP,它封IP的策略做的较多。
- 再后来,我总结出一些心得
爬虫框架集成Spring各个组件后,一个war包50M多,不轻量; - MySQL用来操作数据性能不是很好,Redis做URL队列性能很好,但是用两个数据库就得维护两套环境,不方面快速搭建框架,而且MySQL对于经常需要扩展字段的爬虫领域不方便;
- 在B公司时每次新增业务都要实现一个PageProcessor去传递URL和解析,然后发布,这个流程相对较长,框架不通用;
- 为了解决以上问题,我结合在A公司的通用数据抽取方法和在B公司用的特别熟的Webmagic框架,然后用MongoDB替代MySQL和Redis做了现在这个框架
项目搭建
- 此文章写的时候还是一个单机版本的,就不做MongoDB的集群配置介绍了,土豪可以直接购买阿里腾讯的。
- 项目地址:https://git.oschina.net/yaodongjie/webmagic.git;
- 项目分支:wegmagic-downloader;
- 所需技术
Webmagic+Java8(Lambda)+IDEA - Maven+Git
- MongoDB:数据存储和URL队列操作
- Xpath,XLST:解析目标数据(我参考w3cschool学习)
- 浏览器debug模式+抓包工具(如Fiddler或wireshark等) -
项目介绍
- 通过Application的main方法开启两个线程,A线程用来把任务转换成URL,B线程用来分类爬取URL,两个都是while true循环不断监听数据记录状态
- A线程获取的数据记录(对应SpiderTask类)包含的字段及说明如下
domain:当抽取的URL路径为/a/b/c.html这种形式时,转换成domain/a/b/c.html,即URL补全; - siteCode:给要爬取的网站指定一个站点码,如www.ttmeiju.com可指定为”ttmeiju”;
- business:指定业务码,如我只爬天天美剧的排行榜,可指定为”top”,siteCode和business字段用来给任务分类;
- seedUrl:种子URL,任务的起点URL;
- sleepTime:这个任务产生的子URL抓取之间的时间间隔;
- startTime:记录任务开始时间;
- finishTime:记录任务结束时间;
- firstTime:是否第一次执行此任务,初始为true,第一次全量爬取完毕后设置为false,用它控制更新爬取的时候控制翻页URL生成方式;
- phantomjsPath:设置PhantomJS路径,如果设置了并且URL满足以domain字段开头就用PhantomJS下载页面;
- frequency:抓取频率,如24小时更新爬取一次。和finishTime一起决定下一次更新爬取是什么时候;
- ruleList:解析规则列表,包含如下字段
inRegex:当前抓取URL的正则匹配表达式; - type:当前URL的处理类型(0:提取结果列表;1:提取翻页列表;2:拼装翻页列表;3:提取详情页)
- outXslt:全量爬的时候,都保存URL抽取或者详情页抽取的XSLT文本,更新爬的时候保存更新的翻页URL如,“http://www.xxx.com?page=PAGE_NUMBER&otherParams=OtherValue”;
- outExtra:用来扩展抽取规则,上面三个字段不够用的情况可以使用这个字段,现在已经实现的是更新爬取的翻页页数保存,例如,保存n代表上面URL的PAGE_NUMBER将会替换成1-n来生成翻页URL爬取;
B线程主要类及说明如下
- SpiderUrl:把任务转换成Url队列后,用过siteCode分组URL队列,不同siteCode开启不同线程循环爬取网站,并且按照上面的解析规则生成该站点下新的爬取URL;
已经测试通过的网站(项目有具体步骤代码)
- 天天美剧排行榜:框架初完成
- 搜狗微信公众号文章:框架引入PhantomJS的支持
尾声
- 在很多企业面试时,不仅要问到爬虫方面的技术基础知识,还要问到重难点知识,最终关心的是会不会通用的爬虫框架去快速解决实际问题,如要配置某个行业的关注数据进行全量和更新爬,可能是成百个网站需要配置,而大多数网站的爬取无非就是关注某个起点URL,搜索结果列表,翻页列表,爬取列表详情,有了这个框架就能够支持这些需求了。而且需要掌握的知识不多,遇到不懂的可以在群里问我。祝您在IT行业飞速发展,谢谢。
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
- 【Scrapy框架基于scrapy-redis实现分布式爬虫】
- python爬虫框架scrapy实现模拟登录操作示例
- Adhesive框架系列文章--Mongodb数据服务模块实现(上)
- [置顶] 在Spring MVC框架下利用RESTful API和MongoDB实现用户留言与邮件反馈
- Python爬虫框架scrapy实现的文件下载功能示例
- java 爬虫框架 webmagic
- 设计和实现一款轻量级的爬虫框架
- java 使用webmagic 爬虫框架爬取博客园数据存入数据库
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
- python实现爬虫数据存到 MongoDB
- 使用webmagic实现爬虫程序示例分享
- 基于Python,scrapy,redis的分布式爬虫实现框架
- 【Java】WebMagic实现的最基本的爬虫
- Python之Scrapy框架Redis实现分布式爬虫详解
- WebMagic Java爬虫框架初探
- Scrapy框架学习(三)----基于Scrapy框架实现的简单爬虫案例
- 爬虫框架scrapy之MongoDB的安装
- 爬虫Scrapy框架学习(七)-传统scrapy框架模拟登陆实现(精品)
- 伪分布式网络爬虫框架的设计与自定义实现(一)