标签:
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
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
sudo apt-get install xutils-dev
pagesConnections 500 dnsConnections 20 depthInSite 10 proxy (下外网网页时须设置,但要注意把以上参数调低,以免代理瘫痪) startUrl www.sina.com.cn/ startUrl www.hao123.com/ #.png .jpg .jpeg .bmp .smi .tiff .gif (下图像文件时把这一行注释掉)
#define MIRROR_SAVE #define IMAGES #define ANYTYPE #define RELOAD
#define fifoFileWait "Fifowait" (将fifowait改为Fifowait,此为larbin的一个bug) #define saveDir "save/" (根据需要配置)
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的空文件
CC=gcc-3.3 CXX=g++-3.3
记得以前同事安装过一次,还是我帮着弄好的,最近对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 函数其实是个简单的宏,只是将状态变量简单的设置为i,记录当前爬虫所处在第几个阶段;
其他几个函数,网上查到的资料如下:
1.waitbandwidth() 等待带宽满足需要
2.input() 将需要爬取的seed URL装载进来
3.sequencer() 对将要爬取的页面进行缓冲,确定每一轮可以进行爬取的页面
4.fetchDns() 获取待爬取页面的IP地址和端口号,这需要通过练习DNS服务器将URL进行转换
5.fetchOpen() 获取当前网页
6.checkAll() 做一些检验和网页链接分析(也是我们可以定制化的一部分)
标签:
原文地址:http://www.cnblogs.com/x113/p/4719817.html