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搭建简易服务器分析与实现
Dec 15 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
python处理大数字的方法
May 27 Python
Python使用ftplib实现简易FTP客户端的方法
Jun 03 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
Django如何将URL映射到视图
Jul 29 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 Python
Python中使用subprocess库创建附加进程
May 11 Python
matlab xlabel位置的设置方式
May 21 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
一些星际专用术语解释
2020/03/04 星际争霸
PHP学习之数组的定义和填充
2011/04/17 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
JavaScript 的继承
2011/10/01 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
关于Django外键赋值问题详解
2017/08/13 Python
详细分析python3的reduce函数
2017/12/05 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
几道PHP面试题
2013/04/14 面试题
python re模块和正则表达式
2021/03/24 Python
初中生评语大全
2014/04/24 职场文书
主要负责人任命书
2014/06/06 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
绿里奇迹观后感
2015/06/15 职场文书
未婚证明范本
2015/06/15 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
python字符串常规操作大全
2021/05/02 Python
pandas 实现将NaN转换为None
2021/05/14 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
httpclient调用远程接口的方法
2022/08/14 Java/Android