mfc,larbinnodejs 爬虫框架架等叫什么

开源爬虫larbin分析
编辑:www.fx114.net
本篇文章主要介绍了"开源爬虫larbin分析",主要涉及到开源爬虫larbin分析方面的内容,对于开源爬虫larbin分析感兴趣的同学可以参考一下。
1. larbin简介(百度百科)
&&& larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人Sébastien Ailleret独立开发,用c++语言实现。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。 Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。
& latbin最初的设计也是依据设计简单但是高度可配置性的原则,因此我们可以看到,一个简单的larbin的爬虫可以每天获取500万的网页,实在是非常高效。
& 利用larbin,我们可以轻易的获取/确定单个网站的所有联结,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。
2. 高效的larbin
&&& 简介中提到larbin是一个非常高效的爬虫,但没有说明为什么。这里尝试列出几个原因。此外,由于接触爬虫的时间尚短,没发现的地方,希望各位能补充下。
a. 节省空间的hash容器。在larbin中,hash的主要用途是判重,因此没必要将元素的值记录到hash表中。于是就使用一个位图保存hash code,根据位图某个位是否为1,判断某个元素是否在hash表中。当要插入一个新元素时,就将hash code对应的位置1。这样说可能不容易明白,举个例吧。假设int为32位,位图为int bitmap[100],元素A的hash code为120,将元素A插入到hash容器就是将bitmap的第120位置1,即bitmap[120/32]
| (1 && 120%32)。
b. 减少dns次数。对于一个站点,使用一次dns解析出IP地址后,下次再遇到该站点的其它网页,就用IP地址替换域名。
c. 异步连接。使用单线程非阻塞的方法进行socket连接,充分利用了网络资源和CPU资源。
3. larbin的大致流程
&&& larbin的大致流程可以从main.cc看出,这里去掉不重要语句,给出关键语句形成的流程,并加上注释。
int main(int argc, char *argv[]) {
  global glob(argc, argv)& //使用配置文件初始化global类中的成员变量
  for(; ;) {
&&&&&&& &waitbandwidth()&&//如果用户设置了最大带宽,则由此函数保证带宽的使用情况&
&&&&&&& &input()&&//接收用户的输入,得到初始URL列表&
   sequencer()&//按优先度将URL放到待爬取站点
   fetchDns()&//对站点名即host,进行DNS请求
   fetchOpen()&//从DNS解析成功的站点中,取出一些URL进行socket连接&
   checkAll()&//下载网页,提取URL,并执行用户定制的网页分析
4. larbin的关键函数
&&& 这一节主要使用伪代码说明第3节列出的函数是怎样工作的。
// wait to limit bandwidth usage
waitBandwidth()&{
&  while( 剩余带宽 & 0 ) {
&&    等10ms
&&    if( socket超时 )&   更新待爬取的url数量
&&    更新剩余带宽
&  初始化webServe,等待用户连接
&  接收用户输入,包括优先度,深度,抓取模式,初始URL列表
&  从初始URL得到hostName,portNumber,fileName
&  按优先度将URL放到待爬取队列
//start the sequencer
sequencer()&{
&  得到一轮(perCall)可以加载URL的数量(存放在变量still中)
&  根据URL的优先级加载最多still条URL到待爬取站点
//O this function perform dns calls, using adns
fetchDns()&{
&  从dnsSite取出hostName,发送dns解析请求(发送数量受最大连接数限制)
&  接收dns解析结果
&  if(解析成功) {
&&    获取并解析该host的robots.txt
&&    保存URL到okSites
//O Never block (only opens sockets on already known sites) ; work inside the main thread
fetchOpen()&{
&  while( 空闲连接数 ) {
&&    从okSites取出一个URL
&&    if( 成功打开socket ) {
&&&      向conn填写一些信息&&
&&&      减少一个空闲连接
&&    }
//read fill fd_ give back max fds
checkAll()&{
&  for( 每个连接 ) {
&&    switch( 连接状态 ) {
&&&      case connecting : 检查是否socket错误,若不是,则将状态转为write,break&&
&&&      case write : 写socket请求,将状态转为open,break
&&&      case open : 读网页,分析网页,提取链接(endInput函数),状态转为empty,break
&&    }
&  for( 每个连接 )&更新pollfds数组的状态(与异步IO有关)
5. 参考文献&
&&&& 以下是我看larbin源码时,对我帮助很大的文献。
a. larbin官网
http://larbin.sourceforge.net/index-eng.html
b. larbin的配置和使用
/zhangchaoyang/articles/2031954.html
c. 从larbin看互联网爬虫设计
http://www.oschina.net/question/12_4114
d. Linux网络编程入门
/duzouzhe/archive//1506699.html
e. adns官网
http://ftp.gnu.org/gnu/adns/
本文标题:
本页链接:关于爬虫Larbin
折腾Larbin好多天了,时间像流水一样付出,肚子里的火气也生了灭灭了生,美丽的Larbin却始终没为我爬下一份网页。
网上写larbin的资料很多,参考过的文章不少,参数的修整也尝试过,执行larbin也耐心地跑了一次又一次。但由于C++的Eclipse终归不熟悉,设置断点的debug不能单步调试,只能执行添加注释输出,显示运行良好却总是没有结果。暂且归因为代理服务器设置不正确或者公司的代理服务器限爬虫吧。
Larbin的代码量不算多,英文注释不少,语法也简单,所以读整体代码从语法上没有太大困难,还是一个学习C++语言编程的好机会。或许是笨或者是太缺少网络方面的编程经验了,larbin核心的抓爬及解释的流程没办法理解。
时间可以像流水,但终不是流水。偶放不下、舍不得。现在也不是补网络基础的时间,larbin美媚就先放一下吧。明天开始还是回归MG的好,或许是熟悉的时间太长了,尽管语法结构及代码相对复杂,但MG的操作流程容易理解。我宁愿啃这个外表一般但内心善良的家伙。
一、编译,解压larbin
  ./configure
  gmake&
出现“函数原型和定义不一致”的编译错误。这个好改:打开./adns/internal.h文件,把568-571行直接注释掉就行了。
二、修改参数文件larbin.conf及option.h后,(如何修改请学习其它介绍资料)
./larbin执行
摘录部分larbin的学习资料:
http://blog.csdn.net/anzijin/article/details/3741167
/zhangchaoyang/articles/2031954.html
//1862.html
larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 S&bastien
Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫,也就
是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情
larbin也不提供。一个简单的larbin的爬虫可以每天获取500万的网页。
一个爬虫,首先需要考虑的效率。对于网络而言,基于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的分布式算法。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。//&Larbin//&Sebastien&Ailleret//&15-11-99&-&&14-12-99#ifndef&CONNEXION_H#define&CONNEXION_H/**//*&make&write&until&everything&is&written&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrire&(int&fd,&char&*buf);/**//*&make&write&until&everything&is&written&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrireBuff&(int&fd,&char&*buf,&int&count);/**//**&Write&an&int&on&a&fds&*&(uses&ecrire)&*/int&ecrireInt&(int&fd,&int&i);int&ecrireInt2&(int&fd,&int&i);int&ecrireInti&(int&fd,&int&i,&char&*f);int&ecrireIntl&(int&fd,&long&i,&char&*f);/**//**&Write&an&int&on&a&fds&*&(uses&ecrire)&*/int&ecrireLong&(int&fd,&long&i);/**//*&Write&a&char&on&a&fds&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrireChar&(int&fd,&char&c);#endif&//&CONNEXION_H
&在connexion.h中各个成员函数的作用主要是向套接字中写入数据。& 写入操作中主要使用了 write 系统调用。&&unistd.h中& ssize_t write(int fd , char * buf , int count)& 若是发生写错误,则返回值为-1 ,但是若此时的错误状态为EINTR ,则表示是发生了中断操作,此时应该继续进行写操作。& 若是当前执行的写操作出现了等待的事情,则不需要报错,应该继续写,直到等待的事情结束。&&(1) 误区&&&&&&& &write并不是立即执行写操作,而是将数据写入进内核缓冲区。&&&&&&&& 一般内核区比较稳定,不会出现问题。&&&&&&&&&&(4)下面是connexion的实现代码&&&&&&
//&Larbin//&Sebastien&Ailleret//&15-11-99&-&&03-05-01#include&&stdio.h&#include&&stdlib.h&#include&&unistd.h&#include&&string.h&#include&&sys/socket.h&#include&&netinet/in.h&#include&&netinet/tcp.h&#include&&ctype.h&#include&&netdb.h&#include&&arpa/inet.h&#include&&errno.h&#include&&iostream&#include&"options.h"using&namespace&std&;/**//*********************************//**//*&various&functions&for&writing&*//**//*&make&write&until&everything&is&written&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrire&(int&fd,&char&*buf)&{&&int&pos&=&<span style="color: #&;&&&int&len&=&strlen(buf);&&&while(pos&&&len)&&{&&&&&int&i&=&write(fd&,&buf&+&pos,&len&-&pos)&;&&&&&&if(i&==&-<span style="color: #)&&&&&&&&&{&&&&&&&if(errno&!=&EINTR)&&&&&&&&{&&&&&&&&&&pos&=&len&+&<span style="color: #&;&&&&&&&&}&&&&&}&&&&&&&&else{&&&&&&pos&+=&i&;&&&&}&&}&&&return&pos&!=&len&;}/**//*&make&write&until&everything&is&written&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrireBuff&(int&fd,&char&*buf,&int&count)&{&&int&pos&=&<span style="color: #;&&while(pos&&&count)&&{&&&&&int&i&=&write(fd&,&buf&+&pos&,&count&-&pos)&;&&&&if(i&==&-<span style="color: #)&&&&&&{&&&&&switch(errno)&&&&&{&&&&&&&case&EINTR&:&&&&&&&&&break&;&&&&&&&default:&&&&&&&&&pos&=&count&+&<span style="color: #&;&&&&&&&&&&perror("buf&error")&;&&&&&&&&&break;&&&&&}&&&&}&&&&else&&&&&pos&+=&i&;&&&}&&return&pos&!=&}/**//**&Write&an&int&on&a&fds&*&(uses&ecrire)&*/int&ecrireInt&(int&fd,&int&i)&{&&char&buf[<span style="color: #];&&sprintf(buf,&"%d",&i);&&return&ecrire(fd,&buf);}int&ecrireInt2&(int&fd,&int&i)&{&&char&buf[<span style="color: #];&&sprintf(buf,&"%d%c",&i/<span style="color: #,&i%<span style="color: #&+&'<span style="color: #');&&return&ecrire(fd,&buf);}int&ecrireInti&(int&fd,&int&i,&char&*f)&{&&char&buf[<span style="color: #0];&&sprintf(buf,&f,&i);&&return&ecrire(fd,&buf);}int&ecrireIntl&(int&fd,&long&i,&char&*f)&{&&char&buf[<span style="color: #0];&&sprintf(buf,&f,&i);&&return&ecrire(fd,&buf);}/**//**&Write&an&int&on&a&fds&*&(uses&ecrire)&*/int&ecrireLong&(int&fd,&long&i)&{&&char&buf[<span style="color: #];&&sprintf(buf,&"%ld",&i);&&return&ecrire(fd,&buf);}/**//*&Write&a&char&on&a&fds&*&return&0&on&success,&1&otherwise&*&Don't&work&on&non-blocking&fds&*/int&ecrireChar&(int&fd,&char&c)&{&&int&pos&=&<span style="color: #;&&while&(pos&&&<span style="color: #)&{&&&&int&i&=&write(fd,&&c,&<span style="color: #);&&&&if&(i&==&-<span style="color: #)&{&&&&&&if&(errno&!=&EINTR)&{&&&&&&&&pos&=&<span style="color: #;&&&&&&}&&&&}&else&{&&&&&&pos&+=&i;&&&&}&&}&&return&pos&!=&<span style="color: #;}
(5)综上&&&& Connexion主要处理的是连接相关的信息,其connexion中主要实现的是,向套接字中写入数据。&&&& 下一个系列,处理的是LarbinString&相关,该类主要是处理http报头的。&&&&&&&&开源网络爬虫Larbin的安装及配置
大概用了两天的时间用来安装和配置Larbin。总体来说,关于使用和配置larbin的资料还是有很多的,但在安装和配置过程中,我还是遇到了点问题。不过,终于,问题被解决了,larbin能帮我爬东西了! 先说下自己遇到的问题吧: 1. configure时提示没有makedepend程序。因为自己使用的是centos,所用使用yum install 来安装makedepend程序。安装过程中centos提示没有makedepend包,可以去makedepend的官网上下载了一个makedepend的源代码包,或去这里下载rpm包,给安装到我的centos上了。此方法应该同样适用于redhat等发行版。网上大多数博文说到的是ubuntu发行版,提到的解决方法为安装xutils-dev。
2. 安装+配置完成larbin后,居然没有爬取到结果。在网上查了下,也没有答案。开始怀疑是公司网络有问题,自己回家去试了下,也爬不到网页。后来发现,原来是自己给larbin的starturl有问题。、这些门户作为starturl时都没有结果,但另一些网址,比如http://qdbje.,就可以很顺利地爬取到网页了。
3. 自己在centos上安装Larbin,make的过程中有时居然没有像网上说的那样出现&提示找不到iostream.h这个文件&这一错误,也没有出现与“cerr”有关的错误。非常的奇怪。另外,make过程中一直提示有&XX过期&,因为不是错误,所以没有管,最后也不影响larbin的使用。
4. larbin的官网(http://larbin.sourceforge.net/index-eng.html)被墙了。如果需要,可翻下。当然也可以此链接处下载得到:http://sourceforge.net/projects/larbin/files/ 我把自己修改后可用的larbin放在了github (/sunada/my_larbin)上,按说明安装后即应该可以使用。 以下大部分为网上的博文,在此整理记录下。 Larbin是一种多功能的网络爬虫,一个法国人最初为 XYLEME project写的,当时只是为了获取网络上的XML文件.Larbin是非常灵活可订制的。 最新版本的Larbin(Larbin在2003年以后就不更新了)在一台普通的PC上一天可爬到5,000,000个网页,当然这很大程序上依赖于你的网速.Larbin工作于linux上,并且依赖于一些标准库,比如adns.
一、安装larbin 下载一个larbin-2.6.3.tar.gz解压,进入目录,运行 ./configure make 进行编译安装. 一般会出很多问题,你需要提前完成以下工作: 1. 确认已经安装了build-essential程序包,最新的GCC编译器,已安装了内核程序包. (如果是centos系统,应该只需要保证安装了gcc、g++、make等编译必须的工具就可以了。) 这一步一般都没问题,该装的都装了.
2.configure时会提示找不到makedepend命令,所以你需要安装一下
sudo apt-get install xutils-dev (在centos系统中,可使用yum install makedepend来安装makedepend,或者去makedepned的官网下载一个rpm包来安装) 3.编译的时候还会出一个问题,说从char*转换到byte*出错,这是由 /larbin-2.6.3/adns下internal.h中第568—571行代码引起的,直接把它注释掉即可. 当然也可以改一下
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); 修改为:
adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
vbuf *vb, adns_queryflags flags,
const byte *dgram, int dglen, int *cbyte_io, int max);
改过之后还是会有警告,不过谢天谢地,已经不是error了.
4.make的时候会说找不到&iostream.h&,你需要把每个程序文件里的&&iostream.h&改为&&iostream&,然后加上using namespace std这句话。命令为:
sed -i -e 's/iostream.h/iostream/g'`grep -rl iostream.h *`  
sed -i -e 's/cerr/std::cerr/g'`grep -rl cerr *`
sed -i -e 's/endl/std::endl/g'`grep -rl endl *`
也可以有一种简单省力的方法:到/usr/include/c++/下CP一份iostream文件到larbin的src目录下。并将其的名改为iostream.h.打开此文件添加一句
然后再./configure &make应该就没问题了。
到此,larbin就算安装好了。
二、larbin的配置
larbin的正常使用需要配置options.h和larbin.config这两个文件。如果修改了options.h,则需要重新make一下。如果只修改了larbin.config则不需要重新make。
下面报一下我的两个配置文件里的内容
larbin.conf
httpPort 8099
inputPort 1976
pagesConnexions 100
dnsConnexions 5
waitDuration 60
startUrl http://qdbje. (网上文章中有使用作为startUrl的,但我的实验表明,baidu不允许larbin爬取其首页。以此作为种子url,larbin爬不到结果……)
limitToDomain .com .cn .hk end
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
#ifndef LARBIN_CONFIG
#define LARBIN_CONFIG
#include &config.h&
#define SIMPLE_SAVE
#define FOLLOW_LINKS
#define CGILEVEL 1
#define DEPTHBYSITE
#define RELOAD
#define CRASH
三、Larbin的使用
运行  ./larbin (或“nohup ./larbin &”,可使larbin在后台运行)
中止  Ctrl+C        
重起  ./larbin -scratch
注意停止larbin的时候不要用Ctrl+z,那样当你再次&./larbin或者&./larbin -scratch的时候,会端口已被占用,无法重新启动.
另外,可通过http://localhost:8081/output.html来访问larbin,从页面上获取一些关于larbin运行的信息。
转载于:/sunada2005/archive//3064847.html
1.Larbin试用日记,http://terry831010./blog/static//
2.larbin的安装与配置:http://blog.chinaunix.net/uid--id-3391533.html
本分类共有文章24篇,更多信息详见
& 2012 - 2014 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";
/*爱悠闲底部960*75*/
var cpro_id = "u1888128";

我要回帖

更多关于 python 爬虫框架 的文章

 

随机推荐