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列出目录下指定文件与子目录的方法
Jul 03 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
详解Python自建logging模块
Jan 29 Python
详解python实现线程安全的单例模式
Mar 05 Python
python微信好友数据分析详解
Nov 19 Python
ML神器:sklearn的快速使用及入门
Jul 11 Python
HTML的form表单和django的form表单
Jul 25 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
python 求10个数的平均数实例
Dec 16 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
如何理解python面向对象编程
Jun 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
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
深入理解javaScript中的事件驱动
2013/05/21 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
vue实现通讯录功能
2018/07/14 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
浅谈Python数据类型之间的转换
2016/06/08 Python
pygame实现简易飞机大战
2018/09/11 Python
Python 面试中 8 个必考问题
2018/11/16 Python
在python里面运用多继承方法详解
2019/07/01 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
恐龙的灭绝教学反思
2014/02/12 职场文书
陈欧的广告词
2014/03/18 职场文书
校长个人总结
2015/03/03 职场文书
让世界充满爱观后感
2015/06/10 职场文书
酒店温馨提示语
2015/07/14 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
浅谈Redis缓冲区机制
2022/06/05 Redis
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers