python实现并行爬虫

news/2024/7/19 10:15:27 标签: 爬虫, python

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

 

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

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

 

 

[cpp]  view plain  copy
 
  1. >>> content[0:100]  
  2. '\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`\x014@4\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中字符集的检测:

 

 

[html]  view plain  copy
 
  1. >>> chardet.detect(content)  
  2. {'confidence': 0.99, 'encoding': 'GB2312'}  


好,问题解决了:

 

 

[html]  view plain  copy
 
  1. >>> import urllib  
  2. >>url = 'http://www.sina.com'  
  3. >>response = urllib.urlopen(url)  
  4. >>content = response.read()  
  5. >>> chardet.detect(content)  
  6. {'confidence': 0.99, 'encoding': 'GB2312'}  



 

 

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

 

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

 

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

 

[html]  view plain  copy
 
  1. >>> import urllib  
  2. >>url = 'http://www.sina.com'  
  3. >>response = urllib2.urlopen(url, timeout=1)  
  4. >>content = response.read()  
  5. >>> chardet.detect(content)  
  6. {'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

from: http://blog.csdn.net/abcjennifer/article/details/48270479


http://www.niftyadmin.cn/n/1827737.html

相关文章

nginx 跳转指定接口

nginx 跳转指定接口 场景: 进行stub测试时,程序访问的不是真正的接口,而是stub接口(提供假数据). 但是程序中写的域名,不可能写stub的ip. 如果写死stub的ip,那么到时候上线时还得改代码.(只要动代码,就是有风险的) 所以就需要做一个映射. 使用nginx 实现这个功能 配置文件名称:…

崩溃场景_第09问:MySQL 莫名崩溃,如何保留现场?

问题我的 MySQL 偶尔崩溃&#xff0c;如果需要追查原因&#xff0c;应该如何保留现场&#xff1f;实验MySQL 随着版本不停迭代&#xff0c;崩溃的现象越来越少&#xff0c;也越来越隐蔽。一旦遇到生产环境上的 MySQL 崩溃&#xff0c;就需要保留现场信息&#xff0c;供分析用。…

[程序猿入行必备]CSS样式之优先级

专业玩家请移步&#xff1a;http://www.w3.org/TR/CSS2/cascade.html 使用CSS控制页面样式时&#xff0c;常常出现设定的样式被“覆盖”&#xff0c;不能生效的情况。 浏览器是根据如何的优先次序推断CSS样式的优先级的呢&#xff1f; 总结例如以下&#xff1a; 样式的来源 样式…

ALSA声音编程介绍

ALSA是Advanced Linux Sound Architecture简称。它包含一组kernel 驱动&#xff0c;一个应用编程接口(API)库以及一组工具函数。本文中&#xff0c;我们会向读者展示ALSA项目和组成部件的概况。后面会重点介绍ALSA PCM接口的编程。 ALSA不仅仅是sound API。选择ALSA可以让你最大…

怪物猎人物语稀有9星_《怪物猎人:崛起》试玩版推出,这款游戏有什么好玩的?...

我们知道&#xff1a;任天堂今年&#xff08;2021年&#xff09;会在Switch上推出许多游戏大作&#xff0c;比如&#xff1a;《符文工厂5》、《牧场物语&#xff1a;橄榄镇与希望的大地》、《超级马里奥3D世界狂怒世界》等等&#xff0c;其中卡普空旗下的《怪物猎人》新作《怪物…

MySQL误操作后如何快速回滚(转)

本文转自http://www.cnblogs.com/dfcao/p/6147970.html#undefined 感谢作者 基本上每个跟数据库打交道的程序员&#xff08;当然也可能是你同事&#xff09;都会碰一个问题&#xff0c;MySQL误操作后如何快速回滚&#xff1f;比如&#xff0c;delete一张表&#xff0c;忘加限制…

【MySQL】5.7新特性之一

写在前面MySQL 5.7版本于2015年10月份左右 GA&#xff0c;至今已经半年多了&#xff0c;但自己一直没有时间来follow MySQL 5.7 新的特性&#xff0c;作为MySQL DBA 实在汗颜&#xff0c;以后会花时间来研究5.7 版本的特性并针对部分优化功能做出压力测试。本系列基于5.7.12 版…

三线跑酷例子BlocksRun的技术点

我懒得录视频&#xff0c;简单写个帖子说明一下&#xff0c;引擎版本4.10主要技术点&#xff1a;1.Tile&#xff0b;Trigger实现无限地形刷新2.SetActorLocation&#xff0b;TimeLine实现Actor限时移动3.Collison事件&#xff0c;与碰撞决议处理&#xff0c;里面有一处用了简单…