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 相关文章推荐
pandas DataFrame数据转为list的方法
Apr 11 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python如何统计代码运行的时长
Jul 24 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
python线性插值解析
Jul 05 Python
python 绘制正态曲线的示例
Sep 24 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
python爬虫调度器用法及实例代码
Nov 30 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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
基于Zend的Config机制的应用分析
2013/05/02 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
在Django的上下文中设置变量的方法
2015/07/20 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
python制作填词游戏步骤详解
2019/05/05 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
保护水资源的标语
2014/06/17 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript