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编码时应该注意的几个情况
Mar 04 Python
python opencv实现旋转矩形框裁减功能
Jul 25 Python
pygame实现简易飞机大战
Sep 11 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 Python
详解python爬取弹幕与数据分析
Nov 14 Python
如何用python识别滑块验证码中的缺口
Apr 01 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
我的论坛源代码(六)
2006/10/09 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
php的4种常用运行方式详解
2016/12/22 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
Python使用googletrans报错的解决方法
2018/09/25 Python
设置python3为默认python的方法
2018/10/31 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python API len函数操作过程解析
2020/03/05 Python
中国高端家电购物商城:顺电
2018/03/04 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
迎八一活动主题
2014/01/31 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
自动一体化专业求职信
2014/03/15 职场文书
安全目标责任书
2014/07/22 职场文书
学习计划书怎么写
2014/09/15 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
小学生家长意见
2015/06/03 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书