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的paramiko模块实现远程控制和传输示例
Oct 13 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
Django 源码WSGI剖析过程详解
Aug 05 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 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做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
php常用的url处理函数总结
2014/11/19 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
jQuery ui 1.7更新小结
2009/08/15 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python网络爬虫实例讲解
2016/04/28 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
Python对列表的操作知识点详解
2019/08/20 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
python文件读取失败怎么处理
2020/06/23 Python
谈谈python垃圾回收机制
2020/09/27 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
SQL面试题
2013/12/09 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
最新党员的自我评价分享
2013/11/04 职场文书
采购部岗位职责
2013/11/24 职场文书
《童年》教学反思
2014/02/18 职场文书
高考寄语大全
2014/04/08 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript