[踩坑]python实现并行爬虫

问题背景:指定爬虫depth、线程数, python实现并行爬虫
   思路:    单线程 实现爬虫类Fetcher
                 多线程 threading.Thread去调Fetcher
 
方法:Fetcher 中,用urllib.urlopen打开指定url,读取信息:

response = urllib.urlopen(self.url)
content = response.read()

但是这样有问题, 比如对于www.sina.com来说,读出来的content是乱码的:

>>> content[0:100]
‘\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xec\xbdk\x93\x1c\xd7u \xf8\x99\x8c\xd0\x7fH\x14W\xe8*t=2\xeb\xd5\xd5]H`\[email protected]\x88\x97\x00\xf0%\x10\xea\xc8\xaa\xca\xeeN\xa0\xba\xb2X\x99\x85\x06X\xa8\x1fCj\x1c\xb6ly-\x92\x06\xf5 %\xca"E\xf1!R\x94\xa8\x87C3\x9e\xf1\xd8#\x87\xbd;\x8e\xd8\x99\x8d\xb1\x1d\xf2‘

于是用了python第三方工具chardet,通过

chardet.detect(content)

进行content中字符集的检测:

>>> chardet.detect(content)
{‘confidence‘: 0.99, ‘encoding‘: ‘GB2312‘}

好,问题解决了:

>>> import urllib
>>> url = ‘http://www.sina.com‘
>>> response = urllib.urlopen(url)
>>> content = response.read()
>>> chardet.detect(content)
{‘confidence‘: 0.99, ‘encoding‘: ‘GB2312‘}

但是我们想高效爬虫的时候需要设置urlopen的timeout时间,这在urllib中没有实现,而在urllib2中有实现:

response = urllib2.urlopen(self.url, timeout = self.timeout)

但是这时候再用chardet出现的字符集结果与上次不同:

>>> import urllib
>>> url = ‘http://www.sina.com‘
>>> response = urllib2.urlopen(url, timeout=1)
>>> content = response.read()
>>> chardet.detect(content)
{‘confidence‘: 0.0, ‘encoding‘: None}

这是怎么回事? 原来是这个页面的编码问题, 该页面返回的是gzip编码,参考<python urllib2 returns garbage - Stack Overflow>

实际上每次应该判断页面信息的‘Content-Encoding‘是否为‘gzip‘。

urllib支持gzip页面自动解压而urllib2不支持。 所以对于这种页面, 先解压再read:


try:
    response = urllib2.urlopen(self.url, timeout = self.timeout)
    if response.info().get(‘Content-Encoding‘, "") == ‘gzip‘:  #e.g www.sina.com.cn
        buf = StringIO.StringIO(response.read())
        f = gzip.GzipFile(fileobj=buf)
        content = f.read()
    else:
        content = response.read()
    content = self.enc_dec(content)
    return content
except socket.timeout:
    log.warn("Timeout in fetching %s" % self.url)

到这里,大家是不是都以为我只是个标题党。。。?

*******************************************************************************

那么,就把调通的整个spider文件share一下吧,

程序支持多线程爬虫,主文件为spider.py, testSpider.py为单测(不保证覆盖率)。

程序地址:http://download.csdn.net/detail/abcjennifer/9086751

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 02:22:19

[踩坑]python实现并行爬虫的相关文章

基于Python技术栈的算法落地踩坑

背景介绍 在一些业务场景,我们需要把离线训练好的模型以微服务部署线上,如果是简单的使用sklearn pipeline,可以保存为XML格式的pmml供Java调用,在配置为4 core,8G内存的docker环境可以提供8K左右的高并发,并且这种docker可以快速大规模部署到PaaS云平台,优势相当明显,实际情况是算法人员会基于Python自定义lambda处理数据,而自定义的lambda是很难保存到pmml中的,并且很多公司的算法团队也是要求基于Python技术栈是 落地的. 踩坑过程 算

Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼

目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜单 - Python踩坑指南代码示例 1.1 踩坑案例 小明是个服务器管理员, 他从老管理员手里接手了一个非常繁琐的运维工作: 短暂授权root 账号给不同的 team 接口人运行备份任务 该运维任务有几个特点: 任务需且仅需运行在 root 下 root 账号只能短暂授权给各个小组 通过账号管理平

Python踩坑之旅其一杀不死的Shell子进程

1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行: a. 多线程的网络通信包处理 和控制Master节点交互 有固定Listen端口 b. 定期作业任务, 通过subprocess.Pipe执行shell命令 c. etc 发现坑的过程很有意思: a.重启Agent发现Port被占用了 => 立刻想到可能进程没被杀死, 是不是停止脚本出问题 => 排除发现不是, Agent进程确实死亡了 => 通过 netstat -tanop|grep p

&lt;&lt;Python编程:从入门到实践&gt;&gt;踩坑记 Django

<<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是virtual studio code , 测试起来很是难受,因为我配置的debug环境,断点操作没有作用. 经过我不断的测试,才发现我失败的原因是由于之前的误操作,先建立new_pizzas.py后改为new_pizzas.html的,错误就在这里.在我之后新建

Android开发在路上:少去踩坑,多走捷径【转】

作者:gzjay,腾讯MIG无线产品部 高级工程师 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2.目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行upd

AI相关 TensorFlow -卷积神经网络 踩坑日记之一

上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是google开源出来的人工智能库,由python语言写的 官网地址:http://www.tensorflow.org/   请用科学上网访问 中文地址:http://www.tensorfly.cn/ 当然还有其他AI库,不过大多数都是由python 写的 .net 的AI库叫 Accord.net

(转载)Android开发在路上:少去踩坑,多走捷径

1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行update,可以及时了解Android版本比例趋势. 屏幕密度数据 OpenGL ES版本 也可以参考一下国内一个第三方数据:http://www.umind

人工智能(AI)库TensorFlow 踩坑日记之二

上次 踩坑日志之一 遗留的问题终于解决了,所以作者(也就是我)终于有脸出来写第二篇了. 首先还是贴上 卷积算法的示例代码地址 :https://github.com/tensorflow/models   这个库里面主要是一些常用的模型用tensorflow实现之后的代码.其中我用的是 models/tree/master/tutorials/image/cifar10 这个示例,上一篇也大致讲过了. 关于上次遇到问题是: 虽然训练了很多次,但是每次实际去用时都是相同的结果.这个问题主要原因是

【转】Android开发在路上:少去踩坑,多走捷径

本文是我订阅"腾讯大讲堂"公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门"爬"公众号文章的网站倒是有.我觉得写的很不错.就转载出来,如有版权问题请email告知.   你可以通过扫描下面的二维码来关注"腾讯大讲堂"     ----------------------------------------- 我是可恶的分隔线 -----------------------------------------