python多线程爬虫 爬取多个网页_Python 多线程抓取网页

本文介绍了作者使用Python实现多线程爬虫的过程,对比了自定义爬虫与`urllib2`模块的性能。作者从socket开始,实现了HTTP GET方法,处理了DNS缓存、超时、重定向等问题。实验结果显示,自定义爬虫在效率和页面丢失方面表现较好,但也指出了可以优化的方向,如文件管理和DNS解析等。
摘要由CSDN通过智能技术生成

最近,一直在做网络爬虫相关的东西。 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术的实现。

1、larbin的URL去重用的很高效的bloom filter算法;

2、DNS处理,使用的adns异步的开源组件;

3、对于url队列的处理,则是用部分缓存到内存,部分写入文件的策略。

4、larbin对文件的相关操作做了很多工作

5、在larbin里有连接池,通过创建套接字,向目标站点发送HTTP协议中GET方法,获取内容,再解析header之类的东西

6、大量描述字,通过poll方法进行I/O复用,很高效

7、larbin可配置性很强

8、作者所使用的大量数据结构都是自己从最底层写起的,基本没用STL之类的东西

......

还有很多,以后有时间在好好写篇文章,总结下。

这两天,用python写了个多线程下载页面的程序,对于I/O密集的应用而言,多线程显然是个很好的解决方案。刚刚写过的线程池,也正好可以利用上了。其实用python爬取页面非常简单,有个urllib2的模块,使用起来很方便,基本两三行代码就可以搞定。虽然使用第三方模块,可以很方便的解决问题,但是对个人的技术积累而言没有什么好处,因为关键的算法都是别人实现的,而不是你自己实现的,很多细节的东西,你根本就无法了解。 我们做技术的,不能一味的只是用别人写好的模块或是api,要自己动手实现,才能让自己学习得更多。

我决定从socket写起,也是去封装GET协议,解析header,而且还可以把DNS的解析过程单独处理,例如DNS缓存一下,所以这样自己写的话,可控性更强,更有利于扩展。对于timeout的处理,我用的全局的5秒钟的超时处理,对于重定位(301or302)的处理是,最多重定位3次,因为之前测试过程中,发现很多站点的重定位又定位到自己,这样就无限循环了,所以设置了上限。具体原理,比较简单,直接看代码就好了。

自己写完之后,与urllib2进行了下性能对比,自己写的效率还是比较高的,而且urllib2的错误率稍高一些,不知道为什么。网上有人说urllib2在多线程背景下有些小问题,具体我也不是特别清楚。

先贴代码:

fetchPage.py  使用Http协议的Get方法,进行页面下载,并存储为文件

'''

Created on 2012-3-13

Get Page using GET method

Default using HTTP Protocol , http port 80

@author: xiaojay

'''

import socket

import statistics

import datetime

import threading

socket.setdefaulttimeout(statistics.timeout)

class Error404(Exception):

'''Can not find the page.'''

pass

class ErrorOther(Exception):

'''Some other exception'''

def __init__(self,code):

#print 'Code :',code

pass

class ErrorTryTooManyTimes(Exception):

'''try too many times'''

pass

def downPage(hostname ,filename , trytimes=0):

try :

#To avoid too many tries .Try times can not be more than max_try_times

if trytimes >= statistics.max_try_times :

raise ErrorTryTooManyTimes

except ErrorTryTooManyTimes :

return statistics.RESULTTRYTOOMANY,hostname+filename

try:

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#DNS cache

if statistics.DNSCache.has_key(hostname):

addr = statistics.DNSCache[host

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值