您的位置:首页 > 数据库 > Mongodb

用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做了现在这个框架
  • 框架已经能用了,只需要做一条数据库记录配置就可以完成一个一般网站(没有做防爬的)的数据抓取了。
  • 此文章或者框架有什么需要改进的地方希望能得到码友们的建议,欢迎一起学习交流(QQ群:561956863)
  • 项目搭建

    • 此文章写的时候还是一个单机版本的,就不做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;
    • SpiderResult:taskID字段代表每次新生成自动按照时间格式如20170826123055123自动生成的一个字符串,一个任务记录一次全量爬取或一次更新爬取会生成一个。isProcess代表已经清洗过的,做个逻辑删除。为了保持各个站点各个业务抽取关注不同数据的通用性,预留了field01-field20这20个字段去保存详情页关注数据的结果(这是我个人创新想法)。通过XSLT模板和这个类直接解析下载的网页入库
    • CommonProcessor:每一个URL都会启动一个Processor,实际测试效率也是可以的;
    • CommonPipeline:Processor下载的Page对象直接路由到此Pipeline处理了,因为这是异步的,效率高;
    • parser包:把Java对象和MongoDB文档对象转换的工具类集合
    • service包:操作MongDB的数据模型层

    已经测试通过的网站(项目有具体步骤代码)

    • 天天美剧排行榜:框架初完成
    • 搜狗微信公众号文章:框架引入PhantomJS的支持

    尾声

    • 在很多企业面试时,不仅要问到爬虫方面的技术基础知识,还要问到重难点知识,最终关心的是会不会通用的爬虫框架去快速解决实际问题,如要配置某个行业的关注数据进行全量和更新爬,可能是成百个网站需要配置,而大多数网站的爬取无非就是关注某个起点URL,搜索结果列表,翻页列表,爬取列表详情,有了这个框架就能够支持这些需求了。而且需要掌握的知识不多,遇到不懂的可以在群里问我。祝您在IT行业飞速发展,谢谢。
    • 点赞 1
    • 收藏
    • 分享
    • 文章举报
    像是空气 发布了1 篇原创文章 · 获赞 1 · 访问量 647 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: