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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python中特殊函数集锦
Jul 27 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python的turtle库使用详解
May 10 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
Python安装使用Scrapy框架
Apr 12 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生成静态文件的多种方法分享
2012/07/17 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python pygame实现2048游戏
2018/11/20 Python
详解python数据结构和算法
2019/04/18 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
Python Map 函数的使用
2020/08/28 Python
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
2015年重阳节慰问信
2015/03/23 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
nginx安装以及配置的详细过程记录
2021/09/15 Servers