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+Django在windows下的开发环境配置图解
Nov 11 Python
python 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
python使用opencv进行人脸识别
Apr 07 Python
python实现各进制转换的总结大全
Jun 18 Python
scrapy爬虫实例分享
Dec 28 Python
使用python 3实现发送邮件功能
Jun 15 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
构建高效的python requests长连接池详解
May 02 Python
Django自关联实现多级联动查询实例
May 19 Python
使用Python FastAPI构建Web服务的实现
Jun 08 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中关于普通表单多文件上传的处理方法
2011/03/25 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
Python设计模式之单例模式实例
2014/04/26 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
大二自我鉴定范文
2013/10/05 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
致400米运动员广播稿
2014/02/07 职场文书
舞蹈专业求职信
2014/06/13 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
神农溪导游词
2015/02/11 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python