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解析xml成对应的html示例分享
Apr 02 Python
Python httplib模块使用实例
Apr 11 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
Python打印“菱形”星号代码方法
Feb 05 Python
python ddt实现数据驱动
Mar 14 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
在keras中实现查看其训练loss值
Jun 16 Python
基于tensorflow权重文件的解读
May 26 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语法速查表
2006/12/06 PHP
数字转英文
2006/12/06 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
php微信开发之上传临时素材
2016/06/24 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
7个JS基础知识总结
2014/03/05 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
vue vant Area组件使用详解
2019/12/09 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
Python实现批量转换文件编码的方法
2015/07/28 Python
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
环保口号大全
2014/06/12 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
新学期感想
2015/08/10 职场文书
创业计划书之面包店
2019/09/17 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
关于Python使用turtle库画任意图的问题
2022/04/01 Python
讨论nginx location 顺序问题
2022/05/30 Servers