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实现封装得到virustotal扫描结果
Oct 05 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python中kmeans聚类实现代码
Feb 23 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
django允许外部访问的实例讲解
May 14 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
python实时监控logstash日志代码
Apr 27 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
Python使用windows设置定时执行脚本
Nov 12 Python
Django rest framework如何自定义用户表
Jun 09 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
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP内置加密函数详解
2016/11/20 PHP
DIV始终居中的js代码
2014/02/17 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
跟老齐学Python之折腾一下目录
2014/10/24 Python
详谈python http长连接客户端
2017/06/12 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
美国在线购物频道:Shop LC
2019/04/21 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
历史专业毕业生的自我鉴定
2013/11/15 职场文书
浪费资源的建议书
2014/03/12 职场文书
六五普法规划实施方案
2014/03/21 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
供货协议书范本
2014/04/22 职场文书
学生手册评语
2014/05/05 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
索赔员岗位职责
2015/02/15 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
与死神共舞观后感
2015/06/15 职场文书
关于做家务的心得体会
2016/01/23 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
MYSQL常用函数介绍
2022/05/05 MySQL