Python 爬虫多线程详解及实例代码


Posted in Python onOctober 08, 2016

python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。

虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。
下面用一个实例来验证多线程的效率。代码只涉及页面获取,并没有解析出来。

# -*-coding:utf-8 -*-
import urllib2, time
import threading

class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self)
  self.args = args
  self.func = func

 def run(self):
  apply(self.func, self.args)

def open_url(url):
 request = urllib2.Request(url)
 html = urllib2.urlopen(request).read()
 print len(html)
 return html
if __name__ == '__main__':
 # 构造url列表
 urlList = []
 for p in range(1, 10):
  urlList.append('http://s.wanfangdata.com.cn/Paper.aspx?q=%E5%8C%BB%E5%AD%A6&p=' + str(p))
# 一般方式
 n_start = time.time()
 for each in urlList:
  open_url(each)
 n_end = time.time()
 print 'the normal way take %s s' % (n_end-n_start)
# 多线程
 t_start = time.time()
 threadList = [MyThread(open_url, (url,)) for url in urlList]
 for t in threadList:
  t.setDaemon(True)
  t.start()
 for i in threadList:
  i.join()
 t_end = time.time()
 print 'the thread way take %s s' % (t_end-t_start)

分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线程耗时10s。
多线程代码解读:

# 创建线程类,继承Thread类
class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self) # 调用父类的构造函数
  self.args = args
  self.func = func

 def run(self): # 线程活动方法
  apply(self.func, self.args)
threadList = [MyThread(open_url, (url,)) for url in urlList] # 调用线程类创建新线程,返回线程列表
 for t in threadList:
  t.setDaemon(True) # 设置守护线程,父线程会等待子线程执行完后再退出
  t.start() # 线程开启
 for i in threadList:
  i.join() # 等待线程终止,等子线程执行完后再执行父线程

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python删除文本中行数标签的方法
May 31 Python
python 常用的基础函数
Jul 10 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
python lxml中etree的简单应用
May 10 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
python实现扫雷游戏
Mar 03 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
PyQt QMainWindow的使用示例
Mar 24 Python
python字符串,数值计算
Oct 05 #Python
python制作企业邮箱的爆破脚本
Oct 05 #Python
python爬取NUS-WIDE数据库图片
Oct 05 #Python
python2.7的编码问题与解决方法
Oct 04 #Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 #Python
Python实现屏幕截图的代码及函数详解
Oct 01 #Python
Python爬取APP下载链接的实现方法
Sep 30 #Python
You might like
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
php实现telnet功能示例
2014/04/08 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python实现的单向循环链表功能示例
2017/11/10 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
openCV提取图像中的矩形区域
2020/07/21 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
python如何操作mysql
2020/08/17 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
德国机车企业:FC-Moto
2017/10/27 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
最新离婚协议书范本
2014/08/19 职场文书
服务员岗位职责
2015/02/03 职场文书