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编程之string相关操作实例详解
Jul 22 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python简单定义与使用二叉树示例
May 11 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
python字符串拼接+和join的区别详解
Dec 03 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
关于vue中 $emit的用法详解
2018/04/12 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
python开发之for循环操作实例详解
2015/11/12 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Django之路由层的实现
2019/09/09 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
入伍通知书
2015/04/23 职场文书
教师外出学习心得体会
2016/01/18 职场文书
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers