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通过openpyxl生成Excel文件的方法
May 12 Python
浅谈python为什么不需要三目运算符和switch
Jun 17 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python 多核并行计算的示例代码
Nov 07 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
python3实现高效的端口扫描
Aug 31 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
python实现文件+参数发送request的实例代码
Jan 05 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编程计算日期间隔天数的方法
2017/04/26 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
python中的五种异常处理机制介绍
2014/09/02 Python
Python标准库之collections包的使用教程
2017/04/27 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
itchat接口使用示例
2017/10/23 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
初一生物教学反思
2014/01/18 职场文书
人事专员工作职责
2014/02/22 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
关于爱国的标语
2014/06/24 职场文书
中小学生学籍证明
2014/10/25 职场文书
教师考核表个人总结
2015/02/12 职场文书
学期个人自我总结
2015/02/13 职场文书
如何用python反转图片,视频
2021/04/24 Python
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
JS封装cavans多种滤镜组件
2022/02/15 Javascript