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中map()函数的使用方法示例
Sep 29 Python
python reduce 函数使用详解
Dec 05 Python
python清除函数占用的内存方法
Jun 25 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
如何理解Python中包的引入
May 29 Python
Python错误的处理方法
Jun 23 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
Python包argparse模块常用方法
Jun 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php防攻击代码升级版
2010/12/29 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
一个JavaScript继承的实现
2006/10/24 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
Python中unittest用法实例
2014/09/25 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python模块WSGI使用详解
2018/02/02 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
Python的两道面试题
2013/06/29 面试题
行政文秘岗位职责范本
2014/02/10 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
群众路线对照检查材料
2014/09/22 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
隐形的翅膀观后感
2015/06/10 职场文书