Python多线程爬虫简单示例


Posted in Python onMarch 04, 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正则分组的应用
Nov 10 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
Python用户自定义异常的实现
Dec 25 Python
python识别围棋定位棋盘位置
Jul 26 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 #Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 #Python
用Python编写简单的微博爬虫
Mar 04 #Python
python相似模块用例
Mar 04 #Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 #Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 #Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 #Python
You might like
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
学习Python爬虫的几点建议
2020/08/05 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
.net C#面试题
2012/08/28 面试题
五一活动标语
2014/06/30 职场文书
装修施工安全责任书
2014/07/24 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
实践论读书笔记
2015/06/29 职场文书