Larbin的使用
(1)运行larbin
./larbin -c conf_file
选项-c是指定使用的配置文件,不指定时默认使用的是larbin.conf
当larbin运行起来后进行下面的操作.
(2)在larbin.conf的第12行是httpPort 8081,由于这个端口和我机器上的其他应用冲突了,所以我改成了8099.这样你在浏览器中输入localhost:8099,就会看到统计信息.
(3)在larbin.conf的第15行是inputPort 1976,还好这个端口不冲突.
在终端输入telnet localhost 1976,会进入larbin的输入系统.
我们在此输入
priority:1 depth:3 test:0
http://www.baidu.com
我们把优先级设为了1,保证你输入的URL比一般的URL优先被抓取.如果输入了很多URL,把优先级设为0,防止run out of memory.
depth指定抓取链接的深度.一般不要超过5
test设为0表示如果一面网页之前已经抓取过了,并且现在又要抓取,那就抓取;test设为1可以防止重复的抓取.
第2行以后是我们指定从哪些网页开始抓取.实际上在larbin.conf的第36行有个startUrl就是起这个作用的.
(4)重启larbin
假如你上次从www.baidu.com开始已抓取了很多网页,那么你下次重启larbin的时候它还从www.baidu.com开始按照上次一样抓取这些网页,你自然不这些重复工作,把options.h第102行#define RELOAD前的注释去掉即可.使用"./larbin -scratch"重启larbin.
(5)批量修改文件名
larbin抓取的文件保存在save文件夹下,但是文件都没有.html后缀,默认情况下不是以浏览器打开,很不方便.写一下Perl脚本,把所以文件加一下".html"的后缀,其中用到了File::Find模块.
File::Find方式具有特殊变量,将被赋予特定的信息,显示如下:
-
$_包含目录中的当前文件名
-
$File::Find::dir包含当前目录名
-
$File::Find::name包含$File::Find::dir/$_
#!/usr/bin/perl -w use strict; use File::Find; my $path=shift @ARGV; my $post=".html"; sub add_html{ if(-e $File::Find::name){ if(-f $File::Find::name){ rename $_,$_.$post or die "cannot rename $File::Find::name:$!"; } elsif(-d $File::Find::name){ opendir DH,$File::Find::name or die "Cannot open dir $File::Find::name:$!"; foreach my $subfile (readdir DH){ next if $subfile=~/^\./; } } } else{ print "$File::Find::name does not exist.\n"; } } find(\&add_html,$path);
chmod a+x ./add_post_html.pl
File::Find::find()函数本身就是递归地作用于目录下的所有文件,所以我们不需要在add_html()中递归调用add_html().
在save文件夹下有d00000至d00003文件夹,每个文件夹下又有2000个文件.
$ perl add_dot_html.pl /home/orisun/Master/larbin-2.6.3/save
哥泪流满面,六千多个文件呵,就我那破机子用了不到1秒就把它们全部重命名了!
Larbin的配置
/src/interf/下的文件主要定义抓取的页面如何处理,比如抓取的文件放到哪个路径下,如何提取http头,是否打印错误信息,错误报告放在哪个文件里,状态文件放哪里等等.你可以看useroutput定义了这些接口.
我们下面用到的几个配置文件主要是/larbin-2.6.3/larbin.conf,/larbin-2.6.3/options.h,/larbin-2.6.3/src/types.h
larbin.conf
From:如果有人对larbin这个爬虫提出投诉,那么你可以通过这个邮箱向larbin的创始人发一封邮件. userAgent:网络爬虫的名字.
httpPort和inputPort就不说了,我们上面已经使用过了.
pagesConnexions:并行抓取网页的数量.如果你发现有很多超时,说明你的网速不给力,最好不要设置超过10%.
下面还有一些选项,自已看吧,我就不翻译了.最后两个比较有意思.
limitToDomain:限定你访问的域,比如我设为.cn .hk .com
forbiddenExtensions:你不想抓取哪些后缀形式的文件,比如.mp3文件太大,严重影响你抓取网页的效率,可以把.mp3放这儿.
options.h
改变了这个文件里的选项后必须重新编译larbin.
/
larbin抓取网页后你想如何输出,可以使用这些模块:
DEFAULT_OUTPUT:除了统计什么都不做.
SIMPLE_SAVE:把网页存在磁盘上,每外目录按序号存2000个文件.
MIRROR_SAVE:按照网页本来的层次结构存储它们,每个网站一个文件夹.
STATS_OUTPUT:在每个页面上标记一些状态.我可以通过访问http://localhost:8099/output.html看到这些状态.
每个模块具体做什么事情实际上你可以在types.h里面自已定义.
如果你想自己定义额外的模块,请参阅src/interf/useroutput.cc
/
特定的查找
#define SPECIFICSEARCH
#define contentTypes ((char *[]) { "audio/mpeg", NULL })
#define privilegedExts ((char *[]) { ".mp3", NULL })
contentTypes是从http头里查找的,文件后缀只是为了加速搜索.
如何处理这些特定的页面,有3种方式
#define DEFAULT_SPECIFIC 作为html
#define SAVE_SPECIFIC 存入磁盘.对于很大的文件
#define DYNAMIC_SPECIFIC 对于超大文件,动态分配缓存
如果你想自己定义新的策略,参见src/fetch/specbuf.cc和src/fetch/specbuf.h,
/
让larbin爬虫做什么
FOLLOW_LINKS:根据本网页上的链接抓取其他更多的网页,这个似乎是必须的,否则larbin只抓取你输入的网页,那就没什么意义了.
LINKS_INFO:关联网页的链接信息.这样你就可以建立起网页间的父子关系,可以使用page->getLinks()函数.
NO_DUP:当一个页面上次出错时,这次抓取它直接返回错误,不做新的努力或尝试.
URL_TAGS:在输入系统里面要输入一个数字和一个URL,而不再是一个单独的URL,这样当你抓取到这个页面的时候就可以通过这个数字来等到这个页面.
EXIT_AT_END:没有额外的URL需要抓取时larbin自动停止.
IMAGES:当你想抓取图片的时候,注意在larbin.conf里面forbiddenExtensions的把.jpg .png等都去掉.
ANYTYPE:如果你想抓取类型的文件,那larbin.conf里面forbiddenExtensions就应该为空.
COOKIES:管理cookies.
/
CGILEVEL 是否获得CGI
MAXBANDWIDTH larbin使用的带宽
DEPTHBYSITE 进入新的URL时是否初始化深度
/
THREAD_OUTPUT 是否为输出开辟新的线程
RELOAD 重启时从上次停止的位置继续
/
NOWEBSERVER 不加载webserver,当你不想加载任何线程的时候这项是有用的
GRAPH 在实时的状态报告页面中显示直方图
NDEBUG 屏蔽debug信息
NOSTATS 在webserver中不显示状态信息
STATS 在标准输出中每8秒显示一次状态
BIGSTATS 在标准输出中显示larbin抓取到的页面名称,这样会严重影响速度
CRASH 报告严重的bug
/
types.h
如果你想更细致地调节larbin请更改这个文件,当然要使更改生效,需要重新编译larbin.
比如这里面定义了输出文件放在哪个路径下,index文件用什么文件名,输入系统中最多允许有几个输入连接等.