qiyaTech / javaCrawling

"奇伢爬虫"是基于sprint boot 、 WebMagic 实现 微信公众号文章、新闻、csdn、info等网站文章爬取,可以动态设置文章爬取规则、清洗规则,基本实现了爬取大部分网站的文章。
317 stars 170 forks source link

奇伢爬虫使用介绍


导航


  1. 简介
  2. 运行项目
  3. 爬取网站文章操作手册
  4. 爬取文章配置手册
  5. 爬取效果展现

一.简介


奇伢爬虫基于spring boot 、 WebMagic 实现 微信公众号文章、新闻、csdn、info等网站文章爬取,可以动态设置文章爬取规则、清洗规则,基本实现了爬取大部分网站的文章。

(奇伢爬虫技术讨论群:365155351,大家可以加群一起来讨论哦~)

二.运行项目


1.运行环境

项目开发环境:IntelliJ IDEA 15 , JDK 1.8

2.运行必备配置

2.1.数据库配置

2.2.数据导入

我们提供了一些基础数据供大家测试,在新建的数据库中执行文件db_sql.txt中的sql,就可以将一些必备的表及数据导入数据库了。

2.3.redis 配置

2.4.七牛云存储配置

3.项目运行

4.运行效果及爬取操作

爬虫管理平台界面

项目已经运行起来了,现在我们就来看一下怎么爬取一个网站的文章吧。(现在你打开的爬取平台上已经有了我们做好的一些爬取任务配置,只需要按照下面的步骤操作就可以爬取到很多文章了~接下来想自己试着爬取某网站文章可参照爬取网站文章操作手册

任务监控界面

清洗文章界面

(到这里,整个爬取文章以及清洗的操作就完成了。)

三.爬取网站文章操作手册


这里主要向大家介绍爬取一个网站文章的具体配置操作:

站点管理

添加站点

任务管理界面

添加任务界面

添加任务时,大家要注意两个字段哦:

  1. 是否需要手动执行: 如果选择需要手动执行,则每次重启完项目后需要手动点击 “任务监控管理“ 界面中对应任务的启动按钮哦~ 否则每次重启完项目后系统中会自动启动爬取任务的。

  2. 是否定时执行: 如果选择定时执行,则在任务启动后系统中每天会有两个时间点定时去爬取文章,否则会一直爬取哦~(在爬取一定时间后线程会休眠一段时间,再继续爬取的)

添加任务最重要的是任务规则配置,详见爬取文章配置手册

(添加完任务后就可以执行爬取任务了,爬取任务的操作我们上面已经讲过了哦~)

四.爬取文章配置手册


网站爬取任务规则配置

1.任务规则配置参数介绍:

任务规则

任务规则参数详细配置:

(1).spider 爬虫配置:
  1. weChatUpdatePageProcess:微信爬取更新专用; 需设置下载器weChatDownloader 微信公众号更新爬取示例: { "spider": { "thread": 1, "startUrl": "http://weixin.sogou.com/weixin?type=1&s_from=input&query=oschina2013&ie=utf8&_sug_=n&_sug_type_=", "downloader": "weChatDownloader", "processer": "weChatUpdatePageProcess", "siteid": 13, "pipeline": ["exceptionPipeline","rinseCommPipeline","rinseWeChatPipeline","mySqlArticlePipeline"] }, "site": { "domain": "mp.weixin.qq.com", "proxy": [], "retry": 3, "sleepTime": 5000, "headers": [], "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36" }, "condition": { "endTime": "", "startTime": "" }, "wechat": { "name": "oschina2013", "uid": "oschina2013", "url": "http://weixin.sogou.com/weixin?type=1&s_from=input&query=oschina2013&ie=utf8&_sug_=n&_sug_type_=" }, "rule": { "detailregex": "http://mp\\.weixin\\.qq\\.com/s?\\S+", "listregex": "http://mp.weixin.qq.com/profile?src", "loadlistxpath":"//*[@id='main']/div[4]/ul/li[1]/div/div[2]/p[1]", "listxpath": "", "detailxpath": [ { "name": "title", "reg": "", "value": "//*[@id='activity-name']\/text()" }, { "reg": "", "value": "//*[@id='post-date']\/text()", "name": "publicTime", "simpleDateFormat": "yyyy-MM-dd" }, { "name": "author", "reg": "", "value": "//*[@id='post-user']\/text()" }, { "name": "beforeContent", "reg": "", "value": "//*[@id='js_content']" } ] }, "isCircle": true, "circleInterval":10800, "rinseRules":[ { "action": "add", "type":"attr", "cssquery": "img", "name": "width", "vluae": " 100%" }, { "action": "add", "type":"attr", "cssquery": "img", "name": "height", "vluae": "auto" }, { "action": "replace", "type":"attr", "cssquery": "img", "name": "style", "source": "width: \\d+[.\\d+]px", "target": "width: 100%" }, { "action": "replace", "type":"attr", "cssquery": "img", "name": "style", "source": "width: auto", "target": "width: 100%" }, { "action": "copy", "type":"attr", "cssquery": ".video_iframe", "source": "data-src", "target": "src" } ] }

  2. weChatHistoryPageProcess:微信爬取历史专用; 需设置下载器weChatDownloader 微信公众号历史爬取示例: { "spider": { "thread": 1, "startUrl": "https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5NzM0MjcyMQ==&f=json&frommsgid=&count=10&scene=124&is_ok=1&uin=777&key=777&pass_ticket=QRnKzE8eCui1gEzcgTzGlMMUSP9d7DzbTGtoQOU1OCKoI9yMgM1eTn2dNoBQlv0K&wxtoken=&x5=1&f=json", "downloader": "weChatDownloader", "processer": "weChatHistoryPageProcess", "siteid": 13, "pipeline": ["rinseCommPipeline","rinseWeChatPipeline","mySqlArticlePipeline"] }, "site": { "domain": "mp.weixin.qq.com", "proxy": [], "retry": 3, "sleepTime": 3000, "headers": [ { "name": "Cookie", "value": "news_commid=oDOGxv_sCQKLRbPUnpFOlBxc12sk; wxtokenkey=3af5afc4ad6dc8d50ddb4155017fee8169c40528ecbaedb532c0e00323feea4d; wxticket=898662085; wxticketkey=28a040f7ad3354057a1de315330438a969c40528ecbaedb532c0e00323feea4d; wap_sid=CIDixZ0HEkBiWmtxZTF6QkpTazIzWk1sbUhINUFUek9kM1NBOTFrUE9hOGJId19aeVJOYUlxQy1lMTdXcWxYNmxZR1FuSUYtGAQgpBQogZiS9wgwiYGZxwU=; wap_sid2=CIDixZ0HElxvMXNia1Z0Q1ZrTHNfYWdiODlFVWRlUTJ0cS1qU0U5YUlrbmFLX1h6bDN3WFJDUW5RaG14TVNTc0xUb1hLNEszNHB2UHgxQUt6SEFpcDFKaFpyVDh5b01EQUFBfjCJgZnHBQ==" } ], "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1" }, "condition": { "startTime":"", "endTime":"" }, "wechat": { "name": "", "uid": "", "url": "https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5NzM0MjcyMQ==&f=json&frommsgid=[MESSAGEID]&count=10&scene=124&is_ok=1&uin=777&key=777&pass_ticket=QRnKzE8eCui1gEzcgTzGlMMUSP9d7DzbTGtoQOU1OCKoI9yMgM1eTn2dNoBQlv0K&wxtoken=&x5=1&f=json" }, "rule": { //同上例子配置 }, "isCircle": false, "rinseRules":[ // 同上例子配置 ] }

  3. XPathWebPageProcess:普通网站爬取使用(包括下一页地址页面上有的历史爬取)。 普通网站爬取示例: { "spider" : { "thread" : 1, "startUrl" : "http://www.ceibsreview.com/list/index/classid/128", "downloader" : "", "processer" : "XPathWebPageProcess", "siteid" : "18", "pipeline" : [ "rinseCommPipeline", "mySqlArticlePipeline" ] }, "site" : { "domain" : "www.ceibsreview.com", "retry" : 3, "sleepTime" : 5000, "headers" : [ { "name" : "Content-Type:", "value" : "application\/json" } ], "cookies" : [ { "name" : "mm_session", "value" : "application\/json" } ], "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31" }, "rule" : { "detailregex" : "http://www\\.ceibsreview\\.com/show/index/classid/\\d+/id/\\d+", "listregex" : "http://www\\.ceibsreview\\.com/list/index/classid/128", "listxpath" : "//*[@id='right']/ul[@class='lists']/li/div[1]/a", "detailxpath" : [ { "name" : "title", "reg" : "", "value" : "//*[@id='article']/h3/text()" }, { "reg" : "\\d{4}年\\d+月", "value" : "//*[@id='article']/div[1]/span/text()", "name" : "publicTime", "simpleDateFormat" : "yyyy年MM月" }, { "name" : "author", "reg" : "(.*?) ", "value" : "//*[@id='article']/div[1]/text()" }, { "name" : "beforeContent", "reg" : "", "value" : "//*[@id='article']/div[3]" }, { "name":"introduce", "reg":"", "value":"//div[@class='detail-box']/div[@class='summary']/text()" } ] }, "isCircle" : true, "rinseRules":[ //同上列子 ] }`

  4. XPathWebMorePageProcess:普通网站历史爬取使用(使用条件:历史文章列表的地址类似于下一页拼接的形式,如:infoQ: 、csdn: ); 普通网址历史爬取示例: { "spider" : { "thread" : 1, "startUrl" : "http://blog.csdn.net/?&page=2", "downloader" : "", "processer" : "XPathWebMorePageProcess", "siteid" : "1", "pipeline" : [ "rinseCommPipeline", "mySqlArticlePipeline" ] }, "site" : { "domain" : "blog.csdn.net", "retry" : 3, "sleepTime" : 222, "headers" : [ { "name" : "Content-Type:", "value" : "application\/json" } ], "cookies" : [ { "name" : "mm_session", "value" : "application\/json" } ], "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31" }, "condition" : { "addPage":1, "thisPage":2, "startTime":"2017-03-01", "endTime":"2017-03-30" }, "rule" : { //同上列子配置 }, "isCircle" : false, "rinseRules":[ //同上列子配置 ] }

  5. XPathWebPageListImageProcess:如果网站中含有图片列表,需要取图片,需在规则里增加两个元素,一个是列表的xpath,一个是图片的xpath,如果之前有文章详情的xpath,详情的xpath要在列表的xpath路径范围之内。 图片列表网址爬取示例: { "spider" : { "thread" : 1, "startUrl" : "http:\/\/www.iresearch.cn", "downloader" : "", "processer" : "XPathWebPageListImageProcess", "siteid" : "36", "pipeline" : [ "rinseCommPipeline", "mySqlArticlePipeline" ] }, "site" : { "retry" : 3, "sleepTime" : 5000, "cookies" : [ { "name" : "mm_session", "value" : "application\/json" } ], "headers" : [ { "name" : "Content-Type:", "value" : "application\/json" } ], "domain" : "www.iresearch.cn", "userAgent" : "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.65 Safari\/537.31" }, "rule" : { "itemxpath" : "\/\/div[@class='m-item f-cb z-sort-1']", "detailregex" : "http:\/\/news\\.iresearch.cn\/content\/\\d+\/\\d+\/\\d+.shtml", "listregex" : "http:\/\/www\\.iresearch\\.cn", "listxpath" : "\/\/div[2]\/h3\/a", "itemImagexpath" : "\/\/div[@class='u-img']\/a\/img\/@src", "detailxpath" : [], }, "rinseRules" : [], "isCircle" : true }

  1. rinseCommPipeline:数据清洗pipe (公众号网站必写,可根据参数rinseRules的配置进行清洗);

  2. rinseWeChatPipeline:微信列表图片修改(公众号爬取必选pipe);

  3. mySqlArticlePipeline:数据库保存文章操作(公众号网站必写)。

  4. 网站爬取应用场景示例管道顺序: 普通网址爬取: rinseCommPipeline 、 mySqlArticlePipeline

微信公众号历史爬取:exceptionPipeline 、rinseCommPipeline、rinseWeChatPipeline 、mySqlArticlePipeline

微信公众号更新爬取: rinseCommPipeline、rinseWeChatPipeline 、 mySqlArticlePipeline

(2).Site 站点配置:

站点配置

站点配置

(3).Condition 配置:(目前仅用于爬取历史)

爬取历史配置

(注:若用了thisPage 和 addPage 两个参数,则上述参数“sprider”中process配置为:XPathWebMorePageProcess)*

当网站加载更多时当前地址后面会增加一个参数,参数值为数字,并且有规律的增加。下一页地址类似于(重点是要有“=”,并且后面紧跟数字),如:http://blog.csdn.net/?&page=2

(4).rule规则配置

rule配置

loadlistxpath 参数适用场景:文章列表页面中有下一页(或加载更多)的地址。用了此参数就不可再用condition 配置中的thisPage 和addPage 两个参数。

(5).wechat规则配置(微信仅公众号爬取有用)
(6).rinseRules 清洗配置

此清洗配置可以解决我们在爬取网站文章时纠结与文章排版与你需要的不一致问题。

清洗配置

(上图包含了我们清洗页面中的常用配置。如:增加(add)、替换局部(replace)、替换全部(fullreplace)、删除(delete),还有一个复制操作(copy),目前主要复制属性值)。

微信爬取

微信爬取的基本规则于普通网址一样,不过在微信中爬取文章会经常出现验证码。对此我们的做法是用动态代理爬取文章,这样就不会出现验证码了。完全可以解决大部分人对于验证码的困扰哦~

动态代理

动态代理可以解决爬取过程中出现验证码的问题,下面是在本项目中使用动态代理的方法(大家刚开始测试运行阶段也可以不使用哦~):

完成上面步骤在爬取微信公众号时就可以使用动态代理了,免去验证码之苦~~哈哈

历史爬取

历史爬取配置步骤如下:

https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5MTcyMzEyMA==&f=json&frommsgid=1000000027&count=10&scene=124&is_ok=1&uin=777&key=777&pass_ticket=RLFa08mwKkLcExQhkugeJbL5fWrSbxHkAsITPcEc0BTVHSc6tqW9bJt71z9pWIWw&wxtoken=&x5=1&f=json

设置url

设置cookie

更新爬取

下面是微信公众号更新爬取的步骤:

(到这里我们整个配置就已经完成了,大家可以爬取文章了~)

五.爬取效果展现


下面给大家展示下我们用奇伢爬虫爬取文章后在我们 精益阅读APP 以及 精益阅读小程序 上的展现:

大家可以扫描下方二维码进入小程序哦。进入小程序后可以 点击右上角——>关于精益阅读——>相关公众号 进入我们公众号,有什么问题也可以在公众号中联系客服哦~ 精益阅读小程序

精益阅读界面展现

精益阅读界面展现