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`\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中字符集的检测:
- >>> 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
from: http://blog.csdn.net/abcjennifer/article/details/48270479
python实现并行爬虫的更多相关文章
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- Python学习网络爬虫--转
原文地址:https://github.com/lining0806/PythonSpiderNotes Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scra ...
- 用Python写网络爬虫 第二版
书籍介绍 书名:用 Python 写网络爬虫(第2版) 内容简介:本书包括网络爬虫的定义以及如何爬取网站,如何使用几种库从网页中抽取数据,如何通过缓存结果避免重复下载的问题,如何通过并行下载来加速数据 ...
- 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载
<用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...
- Python 开发轻量级爬虫08
Python 开发轻量级爬虫 (imooc总结08--爬虫实例--分析目标) 怎么开发一个爬虫?开发一个爬虫包含哪些步骤呢? 1.确定要抓取得目标,即抓取哪些网站的哪些网页的哪部分数据. 本实例确定抓 ...
- Python 开发轻量级爬虫07
Python 开发轻量级爬虫 (imooc总结07--网页解析器BeautifulSoup) BeautifulSoup下载和安装 使用pip install 安装:在命令行cmd之后输入,pip i ...
- Python 开发轻量级爬虫06
Python 开发轻量级爬虫 (imooc总结06--网页解析器) 介绍网页解析器 将互联网的网页获取到本地以后,我们需要对它们进行解析才能够提取出我们需要的内容. 也就是说网页解析器是从网页中提取有 ...
- Python 开发轻量级爬虫05
Python 开发轻量级爬虫 (imooc总结05--网页下载器) 介绍网页下载器 网页下载器是将互联网上url对应的网页下载到本地的工具.因为将网页下载到本地才能进行后续的分析处理,可以说网页下载器 ...
- Python 开发轻量级爬虫04
Python 开发轻量级爬虫 (imooc总结04--url管理器) 介绍抓取URL管理器 url管理器用来管理待抓取url集合和已抓取url集合. 这里有一个问题,遇到一个url,我们就抓取它的内容 ...
随机推荐
- JS:操作样式表1:行内样式
//访问元素样式1, stye属性只对行内样式有用 var box = document.getElementById("box"); // alert(box.style.col ...
- HDU 4597 Play Game
题目链接 什么都不想说,最近状态暴跌.. #include <cstdio> #include <cstring> #include <iostream> usin ...
- 【BZOJ2190】【SDOI2008】仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- Bootstrap做的HTML页面在本地IE打开正常,放到服务器上显示就不正常了
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Com ...
- Hibernate条件查询
设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:Hibernate 设计了 CriteriaSpecificat ...
- Linux 的cp命令
Linux 的cp命令 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若 ...
- ZK 长时操作带进度条
LongProcess.zul: <?xml version="1.0" encoding="UTF-8"?> <window id=&quo ...
- 使用Font Awesome替换你的网站图标
http://fortawesome.github.io/Font-Awesome/whats-new/ 使用Font Awesome替换你的网站图标 ******************IE7BUG ...
- Thinkphp验证码异步验证第二次及以后验证,验证错误----待解决
今天进行差错时遇到的问题.别人的回答----链接(http://www.thinkphp.cn/topic/28968.html) 3.2.3版本里的check方法会在第一次验证正确后清除SESSIO ...
- bootstarp 样式细节(tooltip布局)
在写bootstarp中发现的几个小样式问题,记录以后可能用的到 1.有时候我们想要超过td长度后自动显示省略号,我们会使用 table { table-layout: fixed; } table ...