larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫,也就 是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每天获取500万的网页。
利用larbin,我们可以轻易的获取/确定单个网站的所有链接,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。
http://sourceforge.net/projects/larbin/files/latest/download?source=files
- 下载larbin-2.6.3,并解压:tar
-xzvf larbin-2.6.3.tar.gz - larbin-2.6.3需要使用gcc/g++ 3.3.6的版本编译。Ubuntu默认安装的最新版本的gcc,Ubuntu手动安装旧版本gcc的方法如下:
1.下载[http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-3.3/ 3.3.6版本]: gcc-3.3-base_3.3.6-15ubuntu6_i386.deb; cpp-3.3_3.3.6-15ubuntu6_i386.deb; gcc-3.3_3.3.6-15ubuntu6_i386.deb; libstdc++5-3.3-dev_3.3.6-15ubuntu6_i386.deb; libstdc++5_3.3.6-15ubuntu6_i386.deb; g++-3.3_3.3.6-15ubuntu6_i386.deb 2.次按照上序顺序安装: sudo dpkg --force-depends -i xxx.deb
- 如果makedepend指令不存在时,安装xutils-dev包
sudo apt-get install xutils-dev
- 修改larbin.conf文件,建议:
pagesConnections 500 dnsConnections 20 depthInSite 10 proxy (下外网网页时须设置,但要注意把以上参数调低,以免代理瘫痪) startUrl www.sina.com.cn/ startUrl www.hao123.com/ #.png .jpg .jpeg .bmp .smi .tiff .gif (下图像文件时把这一行注释掉)
- 修改options.h
#define MIRROR_SAVE #define IMAGES #define ANYTYPE #define RELOAD
- 修改src/types.h
#define fifoFileWait "Fifowait" (将fifowait改为Fifowait,此为larbin的一个bug) #define saveDir "save/" (根据需要配置)
- 修改larbin代码,生成下载文件列表
1.在src/types.h中72行添加 #define FILELIST "LIST" 2.在src/interf/mirrorsaveuseroutput.cc中添加引用头文件 #include <sys/file.h> 第65行添加 FILE * f_list = fopen(FILELIST, "a"); if(f_list == NULL) return; fprintf(f_list, "%s\n", filename); fclose(f_list); 3.在larbin文件夹下创建一个名为LIST的空文件
- 运行./configure
- 修改config.make文件
CC=gcc-3.3 CXX=g++-3.3
- 运行 make
- larbin配置完毕,搞定!
记得以前同事安装过一次,还是我帮着弄好的,最近对web crawler感兴趣,所以就拿来看看。
从sourceforge下载了larbin2.6.3
解压,进入larbin的主目录
./configure ;一堆warning,还发现了一个error:为函数声明和定义不一致所引起的,修改成一致的就OK了。
若是出现gmake[2]: *** [dep-in] Error 127之类错误
需要安装makedepend工具:
# yum install imake
make;这个也会报一堆错:错误是因为larbin是由C++编写的,2006年的C++类库的使用和现在差异有些不同。此处错误的修正方式:将所有的
1
|
#include<iostream.h> |
变成
1
|
#include<iostream> |
即可,然后在引用cerr的.cc文件中加入
1
|
using namespace std;
|
即可。
./larbin
在oschina上找到larbin的安装文章:《网页爬虫之 Larbin 安装方法》,
1、adns目录找到internal.h文件注释掉568-572行。
?
//adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
//vbuf *vb, parsedomain_flags flags,
//const byte *dgram, int dglen, int *cbyte_io, int max);
2、sudo apt-get install xutils-dev
3、sed -i -e 's/iostream.h/iostream/g' `grep -rl iostream.h *`
4、sed -i -e 's/cerr/std::cerr/g' `grep -rl cerr *`
5、sed -i -e 's/endl/std::endl/g' `grep -rl endl *`
6、sudo apt-get install xutils-dev
以上基本就可以编译成功了。
关于针对单站采集速度慢的解决方案:
1、将larbin.conf里面的waitDuration设置为1,这里不再考虑polite^_^, 设置为1大多数网站其实还能忍受;
2、将types.h里面的maxUrlsBySite修改为254;
3、将main.cc里面的代码做如下修改:
// see if we should read again urls in fifowait
if ((global::now % 30) == 0) {
global::readPriorityWait = global::URLsPriorityWait->getLength();
global::readWait = global::URLsDiskWait->getLength();
}
if ((global::now % 30) == 15) {
global::readPriorityWait = 0;
global::readWait = 0;
}
配置说明:
1.larbin.conf
UserAgent : 客服端标识 当对其他网站抓取时被抓取的网站知道是什么抓取的。
httpPort : 用于运行的http web服务器的端口号 (larbin运行时访问http://localhost:8081/ 设置为:httpPort 8081). 如果将端口号设为0 则不会启动web服务器。这允许larbin不作为单线程运行。通过这个查看爬行结果。
inputPort :你要爬去的urls的端口。如果注释掉或设为0 则可能没有任何输入。如果通过手动或者程序提交爬去的urls则必须连接到计算机的TCP端口1976。即设为: inputPort 1076。可以添加爬行的url。
pagesConnexions : 并行爬取网页的数量。根据自己的网络速度调解。如果超时的太多则要降低这个并行数量。
dnsConnexions : 并行dns域名解析的数量。建议为10 。
depthInSite :对一个站点爬取得深度 。
noExternalLinks :不允许访问外部连接。如果设置则只可访问同一HOST的连接。
waitDuration :访问同一服务器的时间间隔。不可低于30s。建议60s,也不会慢。
proxy :是否用代理连接,是则要设置. 可以不用代理就不要用代理连接,用代理很慢,也可能不适合于代理特别是带有缓存的。
StartUrl : 开始爬取得url. 如:StartUrl http://slashdot.org/。
limitToDomain : 这选项可用则不可以爬行指定的特殊域名。设置方式:limitToDomain .fr .dk end 。则不允许爬行这些域名。
forbiddenExtensions : 不想要的扩展名文件。一定不要禁止.html .htm larbin爬得即使它们。实际上指定禁止也一定是无效的。
用法:forbiddenExtensions .tar .gz .deb
2.options.h
1.选择输出模式 (不用则在前面注释去掉即可)
#define DEFAULT_OUTPUT : 默认模式。 什么都不会输出,所以不要选择这个。
#define SIMPLE_SAVE : 简单保存。存在save/dxxxxxx/fyyyyyy文件中 每个目录下2000个文件。
#define MIRROR_SAVE : 镜像方式存储。按网页的层次存储。可以作为网页的字典。
#define STATS_OUTPUT : 状态输出。在网页上进行状态表示。可以通过查看http://localhost:8081/output.html 查看结果。
这些模式被定制在src/types.h中。自己可以在src/interf/useroutput.cc中定义自己的输出模式。
2.特定查询
设定此模式是查询特定的文件,必须定义两个参数。
#define SPECIFICSEARCH :设置特定的查询。
#define contentTypes ((char *[]) { "audio/mpeg", NULL }) :内容类型。
#define privilegedExts ((char *[]) { ".mp3", NULL }) :文件扩展。 用于查询速度 不涉及类型 类型由上一个决定
设置完要设置特定文件的管理
#define DEFAULT_SPECIFIC :默认管理方式。 作为html有限制除了被解析。
#define SAVE_SPECIFIC :存储特定文件。 允许将文件存储在硬盘上 文件可以很大在src/types.h 可以具体设置。
#define DYNAMIC_SPECIFIC :动态存储模式。对于较大的文件动态的分配buffer。
可以通过"src/fetch/specbuf.cc" and "src/fetch/specbuf.h" 定义特定文件的管理方式。
3. 你要爬虫做什么
#define FOLLOW_LINKS: 不继续子链接。不设置此项则html页不被解析链接也不会爬子链接。通过输入系统添加url时很有用
#define LINKS_INFO :每个网页中包含的子链接的列表。在"useroutput.cc" 用page->getLinks() 访问此信息。
#define URL_TAGS:url标签。设置此项url有一个int(默认为0)。使用输入系统统时应该给定一个int。可以通过其获取url。可以重定向。
#define NO_DUP: 不允许重复。如果设置则遇到相同网页但已遇到过时则不管。
#define EXIT_AT_END :结束退出。没有url可爬取时是否退出。设置则退出。
#define IMAGES:抓取网页中的图片。设置了此项则要更新larbin.conf中禁止项。
#define ANYTYPE:抓取任何类型网页不管其的类型。设置要更新larbin.conf。
#define COOKIES:要larbin管理cookies。只简单实现但很有用。
4. 其他选项说明
#define CGILEVEL 1:定于选项及其参数。用于对爬行的url的限制。
#define MAXBANDWIDTH 200000: larbin使用的带宽大小。不设置则不限带宽。
#define DEPTHBYSITE :当url链接到其他站点时新rul的深度是已被初始化的。
5.效率和特征
#define THREAD_OUTPUT:是否为输入制定一个专用线程。当你在useroutput.cc定义自己的代码时必须设置此项。
#define RELOAD:重启位置记录表。设置此项时可以从上次终止处继续爬取。使用-scratch 选项从上次结束处重启。
6. Larbin怎样工作
#define NOWEBSERVER:不启动服务器。不运行线程时很有用
#define GRAPH:是否在状态也使用柱状图。
#define NDEBUG:不启动调试信息。
#define NOSTATS:不启动状态输出。
#define STATS:启动状态输出。运行时每个一段时间几秒吧就会输出抓取的状态。
#define BIGSTATS:在标准输出上显示每个被抓去的网页名字。会降低larbin速度。
#define CRASH:用于报告严重的bugs用。以make debug模式编译时使用。
以下是结果截图:
http://blog.chinaunix.net/uid-26722078-id-3775344.html
http://blog.chinaunix.net/uid-26548237-id-3391533.html
http://blog.sina.com.cn/s/blog_63a9d9f301014v9z.html
http://www.cnblogs.com/zhangchaoyang/articles/2031954.html
larbin编译成功后,有两个主要方向:一是通过相关资料读Larbin的源代码,最终的目的是自己能开发个简单的爬虫;第二个是分析得到的数据,做数据的分析与挖掘。当然,也有人想把这些数据提取出来后,怎么导入数据库。
所有源代码的读法,肯定要用到工具。在windows下可以用vs系列,而linux开发的源代码则用SourceInsight。所以这里我使用SourceInsight软件看Larbin。
首先通过网络知识了解爬虫的基本知识和基本问题。爬虫从一个URL出发,使用广度优先算法,遍历整个网站。其中涉及URL的规整化(MD5算法),URL的判重(Bloom Filter算法),爬虫队列的设计,对网络和文件存取的控制等问题。
Larbin的主函数中有Larbin爬虫的主要工作流程,其代码如下:
- stateMain(-count);
- waitBandwidth(&old);
- stateMain(1);
- for (int i=0; i<global::maxFds; i++)
- global::ansPoll[i] = 0;
- for (uint i=0; i<global::posPoll; i++)
- global::ansPoll[global::pollfds[i].fd] = global::pollfds[i].revents;
- global::posPoll = 0;
- stateMain(2);
- input();
- stateMain(3);
- sequencer();
- stateMain(4);
- fetchDns();
- stateMain(5);
- fetchOpen();
- stateMain(6);
- checkAll();
- // select
- stateMain(count++);
- poll(global::pollfds, global::posPoll, 10);
- stateMain(7);
其中,stateMain 函数其实是个简单的宏,只是将状态变量简单的设置为i,记录当前爬虫所处在第几个阶段;
- #define stateMain(i) (stateMain = i)
其他几个函数,网上查到的资料如下:
1.waitbandwidth() 等待带宽满足需要
2.input() 将需要爬取的seed URL装载进来
3.sequencer() 对将要爬取的页面进行缓冲,确定每一轮可以进行爬取的页面
4.fetchDns() 获取待爬取页面的IP地址和端口号,这需要通过练习DNS服务器将URL进行转换
5.fetchOpen() 获取当前网页
6.checkAll() 做一些检验和网页链接分析(也是我们可以定制化的一部分)
Larbin的安装与配置 2012-10-30 20:47:48
分类: 网络与安全
由于以前没有接触过网络爬虫,对网络爬虫仅仅停留在听过,具体怎么样不天清楚。正好,需要完成某作业,我想这样可以了解了解这方面的知识了。
- parse.c:115: error: conflicting types for 'adns__parse_domain'
- internal.h:571: error: previous declaration of 'adns__parse_domain' was here
- parse.c:115: error: conflicting types for 'adns__parse_domain'
- internal.h:571: error: previous declaration of 'adns__parse_domain' was here
- gmake[1]: *** [parse.o] 错误 1
- gmake[1]: Leaving directory `/home/leo/leo/larbin-2.6.3/adns'
- make: *** [all] 错误 2
解决方案:
- -bash:./configure:command not found
解决方案:
- ###############################################
- //客户端标记,当对其他网站抓取时,被抓取的网站知道是什么抓取的
- UserAgent larbin_2.6.3
- ############################################
- # What are the inputs and ouputs of larbin
- # port on which is launched the http statistic webserver
- # if unset or set to 0, no webserver is launched
- //用于运行的http web服务器的端口号(larbin运行时访问http://localhost:8081/,设置为http_port 8081).如果将端口设为0,则不会启动web服务器。通过这个可以查看爬行结果。
- httpPort 8081
- # port on which you can submit urls to fetch
- # no input is possible if you comment this line or use port 0
- //你要爬取url的端口。如果注释掉或设为0,则可能没有任何输入。如果通过手动或者程序提交爬取的//urls,则必须练就到计算机的TCP端口1976,即设为:inputPort 1976,可以添加爬行的url。
- #inputPort 1976
- ############################################
- # parameters to adapt depending on your network
- # Number of connexions in parallel (to adapt depending of your network speed)
- //并行爬取网页的数量,根据自己环境的网速调解,如果超时太多,则要降低这个并行数量
- pagesConnexions 100
- # Number of dns calls in parallel
- //并行DNS域名解析的数量。
- dnsConnexions 5
- # How deep do you want to go in a site
- //对一个站点的爬取的深度
- depthInSite 5
- # do you want to follow external links
- //不允许访问外部链接。如果设置则只可访问同一主机的连接
- #noExternalLinks
- # time between 2 calls on the same server (in sec) : NEVER less than 30
- //访问同一服务器的时间间隔。不可低于30s,建议60s
- waitDuration 60
- # Make requests through a proxy (use with care)
- //是否用代理连接,如果用,则要设置、可以不用尽量不要用,这个选项要谨慎
- #proxy www 8080
- ##############################################
- # now, let's customize the search
- # first page to fetch (you can specify several urls)
- //开始爬取的URL
- startUrl http://slashdot.org/
- # Do you want to limit your search to a specific domain ?
- # if yes, uncomment the following line
- //这个选项设置了,则不可以爬行指定的特殊域名
- #limitToDomain .fr .dk .uk end
- # What are the extensions you surely don't want
- # never forbid .html, .htm and so on : larbin needs them
- //不想要的扩展名文件。一定不要禁止.html、.htm.larbin爬取的就是它们。禁止也是无效的
- forbiddenExtensions
- .tar .gz .tgz .zip .Z .rpm .deb
- .ps .dvi .pdf
- .png .jpg .jpeg .bmp .smi .tiff .gif
- .mov .avi .mpeg .mpg .mp3 .qt .wav .ram .rm
- .jar .java .class .diff
- .doc .xls .ppt .mdb .rtf .exe .pps .so .psd
- end
- // Select the output module you want to use
- //默认模式。什么也不输出,不要选择这个
- #define DEFAULT_OUTPUT // do nothing...
- //简单保存,存在save/dxxxxx/fyyyyy文件中,每个目录下2000个文件
- //#define SIMPLE_SAVE // save in files named save/dxxxxxx/fyyyyyy
- //镜像方式存储。按网页的层次存储,可以作为网页的字典。
- //#define MIRROR_SAVE // save in files (respect sites hierarchy)
- //状态输出。在网页上进行状态输出,可以查看http://localhost:8081/output.html查看结果
- //#define STATS_OUTPUT // do some stats on pages
这些模式被定制在src/type.h中,可以在src/interf/useroutput.cc中定制自己的输出模式。
- // Set up a specific search
- //设置特定的查询
- //#define SPECIFICSEARCH
- //内容类型
- //#define contentTypes ((char *[]) { "audio/mpeg", NULL })
- //文件扩展。用于查询速度,不涉及类型,类型由上一个决定
- //#define privilegedExts ((char *[]) { ".mp3", NULL })
- #define DEFAULT_SPECIFIC //默认管理方式。 作为html有限制除了被解析。
- //
存储特定文件。 允许将文件存储在硬盘上 文件可以很大在src/types.h 可以具体设置。 - #define SAVE_SPECIFIC
- //动态存储模式。对于较大的文件动态的分配buffer。
- #define DYNAMIC_SPECIFIC
可以通过"src/fetch/specbuf.cc" and "src/fetch/specbuf.h" 定义特定文件的管理方式。
- //不继续子链接。不设置此项则html页不被解析链接也不会爬子链接。通过输入系统添加url时很有用
- #define FOLLOW_LINKS
- //每个网页中包含的子链接的列表。在"useroutput.cc" 用page->getLinks() 访问此信息。
- #define LINKS_INFO
- //url标签。设置此项url有一个int(默认为0)。使用输入系统统时应该给定一个int。可以通过其获取u//rl。可以重定向。
- #define URL_TAGS
- //不允许重复。如果设置则遇到相同网页但已遇到过时则不管。
- #define NO_DUP
- //结束退出。没有url可爬取时是否退出。设置则退出。
- #define EXIT_AT_END
- //抓取网页中的图片。设置了此项则要更新larbin.conf中禁止项。
- #define IMAGES
- //抓取任何类型网页不管其的类型。设置要更新larbin.conf。
- #define ANYTYPE
- //要larbin管理cookies。只简单实现但很有用。
- #define COOKIES
- #define CGILEVEL 1 //定于选项及其参数。用于对爬行的url的限制。
- #define MAXBANDWIDTH 200000 //larbin使用的带宽大小。不设置则不限带宽。
- #define DEPTHBYSITE //当url链接到其他站点时新rul的深度是已被初始化的。
- //是否为输入制定一个专用线程。当你在useroutput.cc定义自己的代码时必须设置此项。
- #define THREAD_OUTPUT
- //重启位置记录表。设置此项时可以从上次终止处继续爬取。使用-scratch 选项从上次结束处重启。
- #define RELOAD
- #define NOWEBSERVER //不启动服务器。不运行线程时很有用
- #define GRAPH //是否在状态也使用柱状图。
- #define NDEBUG //不启动调试信息。
- #define NOSTATS //不启动状态输出。
- #define STATS //启动状态输出。运行时每个一段时间就会输出抓取的状态。
- #define BIGSTATS //在标准输出上显示每个被抓去的网页名字。会降低larbin速度
- #define CRASH //用于报告严重的bugs用。以gmake debug模式编译时使用。