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实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python分析学校四六级过关情况
Nov 22 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
Python 支持向量机分类器的实现
Jan 15 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python中关于数据类型的学习笔记
Jul 19 Python
python实现文件分片上传的接口自动化
Nov 19 Python
Python基于Faker假数据构造库
Nov 30 Python
Python编程编写完善的命令行工具
Sep 15 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
织梦模板标记简介
2007/03/11 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
python实现博客文章爬虫示例
2014/02/26 Python
python实现定时播放mp3
2015/03/29 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
python的继承知识点总结
2018/12/10 Python
python画图的函数用法以及技巧
2019/06/28 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
普师专业个人自荐信范文
2013/11/26 职场文书
民族精神月活动总结
2014/08/28 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
Python&Matlab实现樱花的绘制
2022/04/07 Python
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技