Heritrix 众坑英雄谱
Heritrix是一个开源爬虫框架,1.x和现在的2.x、3.x有很大的不同。但网上搜到的教程好像都是针对1.x的,最近也在用它做爬虫,没有修改源代码直接用,发现…….神坑…..
运行还是非常简单的,下载tar.gz(注意不是src)后解压,配置一下conf里面的heritrix.properties添加一下用户名密码(admin:admin),也可以修改一下监听端口。
然后运行bin/heritrix就可以了,如果想要其他机器也能访问,加上”-b /“参数即可。
接下来就是各种坑……..
GC是什么?
heritrix是java编写的,运行在java虚拟机下,默认的堆内存是256m,要是爬取比较暴力或者持续时间长的话,它会经常报”serious error”说在GC的时候发生了啥啥啥错误,然后job就停了下来,需要手动resume,但是一会它就又停了。这时候就需要在启动前先设置一个环境变量:
1 | export JAVA_OPTS="-Xmx1024m" |
这样就可以告诉heritrix最大堆内存为1G,不过如果机子内存小就没办法了…….
奇怪的过滤器
作为网页爬虫特别是需要爬取很多文档的爬虫来说肯定不希望爬取一些其他的东西譬如视频图片这种体积比较大的文件,这次我需要爬取20万份文档,要是爬了太多视频得到的内容就会臃肿不堪而且毫无用处,所以肯定得设置过滤。
关于这个问题我一直没有搞明白,明明已经设置了很多过滤了比如content-type这种都用上了但是它还是会爬取其他东西,各种图片还是会被download下来,看来设置在后面几个module上的过滤器好像用处很小,还是得在第一个BroadScope中设置过滤器。
正则?失败的起点
直接使用正则表达式过滤URI吧,这样好像比较靠谱的样子,好像需要过滤的内容挺多于是乎就有了一长串的匹配:
1 | [\S]*\.(ogv|webm|asf|asx|bz2|tgz|tiff?|txt|TXT|exe|jar|ico|ICO|pdf|PDF|docx?|DOCX?|mso|mov|MOV|ogg|js|css|flv|FLV|swf|SWF|mp4|mpe?g|MPE?G|avi|AVI|rmv?b?|RMV?B?|gif|GIF|jpe?g|JPE?G|png|PNG|bmp|BMP|pptx?|xlsx?|wmv|WMV|mp3|rar|zip|gz)$ |
这样好像能够过滤掉很多无关的东西了吧?是的,当你submit job以后发现,任务直接就完成了!然后在log里面给了个这玩意:
Heritrix(-63)-Prerequisite unschedulable failure
任务在第一步的时候就停了,根本没有front,然后你删掉这个正则,它又开始爬取别的东西了。
不过后来我发现了一个解决办法:
首先把上面的正则写短一点,少过滤一些东西,等job开始后queue一些页面,然后再edit config把整段表达式加进去,这样就不会从seed出来就跪了。
不要手贱
一般想要从现有的job新建一个job的话就选base on an existing job就好了,然后改改配置。但是点setting、submodule、module就好了,submit job前面还有俩设置,如果不需要的话就别点了,如果点进去还不设置东西的话又会报错,然后你一去点那个消息自己的这个Job就丢了,还得重新来,而且它也不给出具体的错误就告诉你order.xml row 1 column 160这个位置,其实跟这个位置毫无关系……..这句话的意思就是你的配置有问题至于问题在哪不知道……….
format string
嗯上面说到配置文件的问题,在设置的时候还有个需要注意的地方就是User-Agent与Email这两项,Email还好说填一个符合email格式的就好了不一定必须存在。但User-Agent必须严格按照它的格式来,在它大写字母的地方填上project的url,可以写http://127.0.0.1,写成这样:
1 | Mozilla/5.0 (compatible; heritrix/1.14.4 +http://127.0.0.1) |
注:加号前面有个空格,如果丢了这个空格它又会告诉你order.xml row 1 column 160错误然后你不知道怎么回事。
折腾了好几天,总算让它能够工作了,虽然还是会爬一些比较大的文件但那应该是服务端的问题了因为uri和content-type不符所致,最终还是没能得到20W+的文档比较遗憾。
其实王道还是修改源代码,那才是真正能够定制符合自己需求爬虫的方法。