2019独角兽企业重金招聘Python工程师标准>>>
使用webpasser框架抓取某一笑话网站整站内容。webpasser是一款可配置的爬虫框架,内置页面解析引擎,可快速配置出一个爬虫任务。配置方式将页面解析和数据存储分离,如果目标网站改版,也可以快速修复。
配置说明如下(该例子完整配置见http://git.oschina.net/passer/webpasser):
1.先写总的抓取参数:网页编码是gbk,请求超时时间是5秒,请求失败重试5次,抓取失败后等待时间10秒,设置10个线程抓取,每次抓取后不等待。这里不设置请求头信息、cookie,代理了。
<fetchConfig charset="gbk" timeOutSecond="5" errorRetry="5" errorDelayTime="10" runThreadNum="10" fetchPrepareDelayTime="0" ><userAgent>Mozilla/5.0 (compatible; webpasser;)</userAgent><headers><!-- <header name="Referer" value="http://www.jokeji.cn" /> --></headers><!-- HTTP Cookie --><cookies><!-- <cookie name="cookie1" value="" host="" path=""/><cookie name="cookie2" value="1" /> --></cookies> <!-- 代理设置: 从ip.txt中批量获读取ip,每次抓取随机使用某个ip --><!-- <proxies path="ip.txt"></proxies> --><!-- 单个代理获取 ,pollUrl的系统链接中需随机返回一个代理ip,格式是 ip:port (当使用proxy标签时proxies失效) --><!-- <proxy pollUrl="http://localhost:8083/proxyManage/pollProxyIp.action?task=xunbo" ></proxy>--></fetchConfig>
2.scope表示限制抓取的链接域名范围(注意limitHost里一定要是域名,不能在前后加http或/),seeds表示从这些seed为入口开始抓取。
<scope><limitHost value="www.jokeji.cn" /></scope> <!-- 种子 --><seeds><seed url="http://www.jokeji.cn/" /> </seeds>
3.如果网页的链接格式符合scope的规则,则进入这个page的解析策略。digLink是用来从一个网页中挖取新的链接。用jsoup语法指定从所有的a标签挖取新链接。由于新链接是相对链接,用relativeToFullUrl处理链将相对链接转为绝对链接。
<page><scope><rule type="regex" value="http://www.jokeji.cn(.*)" /></scope><!-- 链接挖取 --><digLink ><rules><rule type="jsoup" value="a[^href]" attr="href" /><rule type="relativeToFullUrl" /> </rules></digLink></page>
4.抽取详情页中想要的具体业务数据,经过下面解析后返回指定的map数据。
(1)获取标题数据:通过jsoup语法(jquery选择器)获得title标签中的内容;由于title内容中"_"后面的内容不需要,通过“cut”便签(截取处理链)将“_”后面的内容去除。
(2)获取文章内容的数据:通过jsoup语法(jquery选择器)获得id为text110的标签里的内容。
<!-- 解析具体的业务数据,处理后是一个map--><page><scope><rule type="regex" value="http://www.jokeji.cn/jokehtml/(.*).htm" /></scope><field name="title" ><!-- 提取某个字段数据的处理链 --><rules><rule type="jsoup" value="title" exp="html()" /><rule type="cut" ><pre></pre><end>_</end></rule></rules></field><field name="content" > <rules> <rule type="jsoup" value="#text110" /></rules></field></page>
5.解析好的数据持久化配置(存储步骤4中的数据):target为handleResultMapInterface是固定值,表示是持久化的类,classPath是具体的实现类。com.hxt.webpasser.persistent.impl.DiskJsonHandleResult是存储到硬盘的实现类demo,该类属性有rootDir(保存到哪个文件夹)、charSet(存储时的编码),详见该类。可自定义编写持久化类,继承HandleResultMapInterface接口,有些属性用配置传入。(建议持久化是另外一个独立项目提供数据存储的http接口,爬虫请求该接口将数据push进去,这样分离维护比较方便,例com.hxt.webpasser.persistent.impl.VideoPushServcieImpl)
<!-- 抓取解析后的数据持久化 --><resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.DiskJsonHandleResult"><property name="rootDir" value="downdir/path/jokeji" ></property><property name="charSet" value="gbk" ></property></resultHandler>
6.配置写好后就可以加入任务,启动测试了。建议可以单个测试下。