主要是配置larbin.conf文件和options.h
注意:更改前者可以直接运行,如果更改了第二个就要重新make了!!!
如果你英文够好的话就可以直接看了,都有详细的解释。不行的话就看翻译吧http://blog.chinaunix.net/uid-26548237-id-3391533.html
根据你自己的需要改一下配置吧。
我就把我的配置给大家看一下,仅供参考:
larbin.conf->
UserAgent larbin_2.6.3
httpPort 8081
inputPort 1976
pagesConnexions 100
dnsConnexions 5
depthInSite 5
waitDuration 60
startUrl http://www.jd.com/
options.h->
#define SIMPLE_SAVE
#define FOLLOW_LINKS
#define NO_DUP
#define EXIT_AT_END
#define CGILEVEL 1
#define DEPTHBYSITE
#define GRAPH
#define STATS
#define BIGSTATS
重新编译运行,感觉就要成功!(浏览器里面输入localhost:8081可以监控)
然后运行还没一秒,就结束了。当时我在想,卧槽,这爬虫也太快了吧,我的深度设置的可是5啊。看save文件夹,什么都没有!!!
我百思不得其解啊,又看了一遍配置文档,没什么地方有错误啊。然后看了下网上的例子,也差不多啊。我灵机一动把起始网站换成了我大淘宝,重新来了一遍,果然成功了。
save文件夹下多了很多文件,打开一看是正确的localhost8081也有反应了。
经历诸多磨难,我发现时京东网页太大,larbin默认是100k以下的网页。这里还要用到一个配置文件./src/types.h
将其中的#define maxPageSize 100000
#define nearlyFullPage 90000都乘以3就行了(具体可以根据自己的需求更改)
成功了!!!!!
larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每天获取500万的网页。
利用larbin,我们可以轻易的获取/确定单个网站的所有链接,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。
larbin爬虫,如果有可能会给它添加一个删除功能,因为其排重部分用的是bloom filter算法,这个算法的有点很明显,对大规模数据的处理很快,性能很好,而且内存占用很小,但是什么事都没有尽善尽美的,该算法的直接缺点就是不能删除,还会出现误判情况。关于bloom filter有很多相关论文,网上也有些高质量的文章,暂时不做累述,之后如果自己有不一样的看法,再写关于该算法的文章。
从Larbin看互联网爬虫设计
于敦德
2005.12.16
转载请注明出处
互联网是一个庞大的非结构化的数据库,将数据有效的检索并组织呈现出来有着巨大的应用前景,尤其是类似RSS的以XML为基础的结构化的数据越来越多,内容的组织方式越来越灵活,检索组织并呈现会有着越来越广泛的应用范围,同时在时效性和可读性上也会有越来越高的要求。这一切的基础是爬虫,信息的来源入口。一个高效,灵活可扩展的爬虫对以上应用都有着无可替代的重要意义。
要设计一个爬虫,首先需要考虑的效率。对于网络而言,基于TCP/IP的通信编程有几种方法。
第一种是单线程阻塞,这是最简单也最容易实现的一种,一个例子:在Shell中通过curl,pcregrep等一系统命令可以直接实现一个简单的爬虫,但同时它的效率问题也显而易见:由于是阻塞方式读取,dns解析,建立连接,写入请求,读取结果这些步骤上都会产生时间的延迟,从而无法有效的利用服务器的全部资源。
第二种是多线程阻塞。建立多个阻塞的线程,分别请求不同的url。相对于第一种方法,它可以更有效的利用机器的资源,特别是网络资源,因为无数线程在同时工作,所以网络会比较充分的利用,但同时对机器CPU资源的消耗也是比较大,在用户级多线程间的频繁切换对于性能的影响已经值得我们考虑。
第三种是单线程非阻塞。这是目前使用的比较多的一种做法,无论在client还是server都有着广泛的应用。在一个线程内打开多个非阻塞的连接,通过poll/epoll/select对连接状态进行判断,在第一时间响应请求,不但充分利用了网络资源,同时也将本机CPU资源的消耗降至最低。这种方法需要对dns请求,连接,读写操作都采用异步非阻塞操作,其中第一种比较复杂,可以采用adns作为解决方案,后面三个操作相对简单可以直接在程序内实现。
效率问题解决后就需要考虑具体的设计问题了。
url肯定需要一个单独的类进行处理,包括显示,分析url,得到主机,端口,文件数据。
然后需要对url进行排重,需要一个比较大的url Hash表。
如果还要对网页内容进行排重,则还需要一个Document Hash表。
爬过的url需要记录下来,由于量比较大,我们将它写到磁盘上,所以还需要一个FIFO的类(记作urlsDisk)。
现在需要爬的url同样需要一个FIFO类来处理,重新开始时,url会从定时从爬过的url FIFO里取出来,写到这个FIFO里。正在运行的爬虫需要从这个FIFO里读数据出来,加入到主机类的url列表里。当然,也会从前一个FIFO里直接读url出来,不过优先级应该比这个里面出来的url低,毕竟是已经爬过的。
爬虫一般是对多个网站进行爬取,但在同时站点内dns的请求可以只做一次,这就需要将主机名独立于url,单独有一个类进行处理。
主机名解析完成后需要有一个解析完成的IP类与之应用,用于connect的时候使用。
HTML文档的解析类也要有一个,用来分析网页,取出里面的url,加入到urlsDisk。
再加上一些字符串,调度类,一个简单的爬虫基本上就完成了。
以上基本上是Larbin的设计思路,Larbin在具体实现上还有一些特殊的处理,例如带了一个webserver,以及对特殊文件的处理。 Larbin有一点设计不不太好,就是慢的访问会越来越多,占用大量的连接,需要改进,另外如果对于大规模的爬虫,这仅仅实现了抓取的部分,要分布式的扩展还需要增加url的集中管理与调度以及前台spider的分布式算法。
http://sourceforge.net/projects/larbin/files/latest/download?source=files
记得以前同事安装过一次,还是我帮着弄好的,最近对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
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
- // 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
- //不继续子链接。不设置此项则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模式编译时使用。