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判断图片宽度和高度后删除图片的方法
May 22 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
深入理解Python异常处理的哲学
Feb 01 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
python 动态迁移solr数据过程解析
Sep 04 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
python super()函数的基本使用
Sep 10 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
python基础之文件处理知识总结
May 23 Python
Python制作动态字符画的源码
Aug 04 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
CI框架常用函数封装实例
2016/11/21 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
工作疏忽检讨书
2014/01/25 职场文书
法制宣传教育方案
2014/05/09 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
写给医院的感谢信
2015/01/22 职场文书
大学生受助感言
2015/08/01 职场文书