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中for循环的使用方法
May 14 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
pytorch使用Variable实现线性回归
May 21 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
Pytest mark使用实例及原理解析
Feb 22 Python
解决python运行启动报错问题
Jun 01 Python
如何理解Python中的变量
Jun 01 Python
pytorch使用horovod多gpu训练的实现
Sep 09 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 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
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php输出图像的方法实例分析
2017/02/16 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
微信小程序实现下拉框功能
2019/07/16 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
Django视图扩展类知识点详解
2019/10/25 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
企业挂职心得体会
2014/09/10 职场文书
简易版租房协议书范本
2014/10/13 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android