分布式网页爬虫QQQ

制作过程中参考的网页:

http://www.cnblogs.com/hnrainll/archive/2011/08/16/2140101.html

http://www.cnblogs.com/FengYan/archive/2012/02/04/2338630.html


最近课程作业要做一个爬虫,突然想起之前学习过UNP里面的非阻塞IO,以及多路复用,正好能学以至用,所以选择用linux c写一个分布式爬虫,

网上一搜其实爬虫的原理其实几分钟就可以搞懂,关键是抓取网页效率要高.

先说说我这个分布式网页爬虫的完成情况:

已完成部分:
1.能够通过一个或多个起始站点地址,进行网页收集.

2.支持HTTP协议,CHUNKED编码,将收集到的网页存储到文件。

3.可以新增爬虫节点 (同一主机下或者新增服务器) 进行工作。

4.多个爬虫节点间不存在重复性的爬虫。

既然是分布式爬虫,就必然分爬虫主机程序和爬虫节点.

先说说主机程序:

     主机负责的任务有:

    1).对节点传回的从网页中抓取到的新增的url进行排重过滤,使用的是布隆过滤算法.

    2).对排重后的url进行包装成一个URL类,包含域名,请求路径.

    3).查找URL域名对应的ip,这里我在内存建立了一个 DNS缓存,之前解析过的域名的IP会存储在这个缓存里面,下次遇到解析过的域名 就可以直接从缓存中取出.

    4).把包含 包含域名,请求路径,ip的URL类分发给爬虫节点.

    以上4个任务我分别开辟了4个线程进行工作, 而主线程适用select监控是否有新的爬虫节点连入,以及是否有爬虫节点传回新抓取的url.

    爬虫节点程序:
    总所周知,对于网络而言,基于TCP/IP的通信编程有几种方法。第一种是单线程单连接阻塞,第二种是多线程多连接阻塞,

    第三种是单线程多连接非阻塞。这是目前使用的比较多的一种做法,无论在client还是server都有着广泛的应用。在一个线程内打开多个非阻塞的连接,通过poll/epoll /select对连接状态进行判断,在第一时间响应请求,不但充分利用了网络资源,同时也将本机CPU资源的消耗降至最低。

    因为爬虫节点不会太多,所以我选择了使用比较简单的select非阻塞模型.

    爬虫节点负责的任务有:
    
    1).从爬虫主机程序获得url抓起任务,对指定url发起请求连接

    2).读取并存储从服务器发来的网页源代码.

    3).对网页源代码进行解析,获取其中的url,解析完毕后打包发回主机.

    非阻塞体现在两个地方:

    1).对服务器发出请求连接后,如果服务器不能马上作出回应,就先不管这个连接,切换到其他连接中,查看是否已经有可读的套接口.

    2).读取了一次服务器发来的信息后,下一次信息的到达并非是马上到达,所以这时也是切换到下一个其他连接中,查看是否已经有可读的套接口.

    以上两个操作就可以使得CPU一直处于高效使用中.


需要改进的地方:

1.负载平衡: 多个爬虫节点间可能会出现某些节点u有待发起连接url过多,某些节点很少甚至没有url任务.

2.增加对robots.txt的解析.

3.使用ssl,增加对https协议的支持.

4.学习正则表达式,把网页解析部分改用正则表达式实现.

5.允许中途有爬虫节点退出工作.

    





   

猜你喜欢

转载自blog.csdn.net/lewiskyo/article/details/27645053
今日推荐