python并发爬虫实用工具tomorrow实用解析


Posted in Python onSeptember 25, 2019

tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的一个模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰一个普通的函数,既可以达到并发的效果,本篇将用实例来展示tomorrow的强大之处。后面将对tomorrow的实现原理做进一步的分析。

1.安装第三方包

pip install requests_html #网络请求包
pip install fake-useragent #获取useragent包
pip install tomorrow

2.普通下载方式

在这里我们用20个电影网址进行测试,并获取其标题,计算所用的时间

start=time.time()
for i in url_list:
   print(get_xpath(get_req(i),"//title//text()"))
end=time.time()
print("普通方式花费时间",end-start)

get_req是我定义的访问网络的一个方法,get_xpath是为例使用xpath表达式获取其结果,这里是获取网址的标题。20个电影网址普通方式访问的结果在8-9秒之间。

3.使用tomorrow以后

start2 = time.time()
req_list = []
for url in url_list:
  req = async_get_req(url)
  req_list.append(req)

for req in req_list:
  print(get_xpath(req, "//title//text()"))
end2 = time.time()
print("并发后花费时间", end2 - start2)

如果我们想要使用tomorrow,就要尽量减少耗时操作,访问网络并等待其回应就是一个非常耗时的工作,在这里我们需要做的是,并发的时候除了访问网络不要做其他操作,然后我们把获取的请求存一个列表,然后再去循环做其他操作,看不懂我说的没关系,直接看下面代码并尝试几次就明白了。

4.测试结果对比

来看程序的完整代码:

import time
from requests_html import HTMLSession
from fake_useragent import UserAgent as ua
from tomorrow import threads

headers = {"User-Agent": ua().Chrome}
session = HTMLSession()
url_list = ["https://movie.douban.com",
      "http://www.1905.com/",
      "http://www.mtime.com/",
      "https://www.dy2018.com/",
      "http://dytt8.net",
      "https://www.piaohua.com/",
      "http://maoyan.com",
      "https://www.xigua110.com/",
      "https://www.vmovier.com/",
      "http://movie.kankan.com/",
      "https://107cine.com/",
      "http://movie.youku.com",
      "http://film.qq.com",
      "http://film.spider.com.cn",
      "https://dianying.taobao.com/",
      "http://www.wandafilm.com/",
      "http://www.dygang.net/",
      "http://www.bale.cn/",
      "http://dianying.2345.com/",
      "http://v.x2y4.com/"]


def get_req(url, timeout=10):
  req = session.get(url, headers=headers, timeout=timeout)
  if req.status_code == 200:
    return req


@threads(5)
def async_get_req(url, timeout=10):
  req = session.get(url, headers=headers, timeout=timeout)
  if req.status_code == 200:
    return req


def get_xpath(req, xpath_str):
  return req.html.xpath(xpath_str)[0].strip().replace("\n", "")


start=time.time()
for i in url_list:
   print(get_xpath(get_req(i),"//title//text()"))
end=time.time()
print("普通方式花费时间",end-start)

start2 = time.time()
req_list = []
for url in url_list:
  req = async_get_req(url)
  req_list.append(req)

for req in req_list:
  print(get_xpath(req, "//title//text()"))
end2 = time.time()
print("并发后花费时间", end2 - start2)

运行三次上面的程序记录下每次的结果

第一次:
普通方式花费时间 7.883908271789551
并发后花费时间 2.2888755798339844
第二次:
普通方式花费时间 8.522203207015991
并发后花费时间 2.4674007892608643
第三次:
普通方式花费时间 9.062756061553955
并发后花费时间 2.8703203201293945

tomorrow使用起来很简单,在普通的函数上面加个threads装饰器即可以实现并发效果,括号中的数字是表示并发的次数,经过我的测试并不是并发次数越多越好,你需要选择一个中间点,因为还会受到网速的影响,我觉得一般并发数5-10就好.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
基于python图像处理API的使用示例
Apr 03 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
教你怎么用python实现字符串转日期
May 24 Python
python关于集合的知识案例详解
May 30 Python
Python经常使用的一些内置函数
Apr 11 Python
python语言中pandas字符串分割str.split()函数
Aug 05 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 #Python
python异步编程 使用yield from过程解析
Sep 25 #Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 #Python
Python缓存技术实现过程详解
Sep 25 #Python
Laravel框架表单验证格式化输出的方法
Sep 25 #Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 #Python
python 用户交互输入input的4种用法详解
Sep 24 #Python
You might like
php daodb插入、更新与删除数据
2009/03/19 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
深入理解node.js http模块
2018/01/24 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
详解js的视频和音频采集
2018/08/09 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python简单遍历字典及删除元素的方法
2016/09/18 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
详解python编译器和解释器的区别
2019/06/24 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
给领导的致歉信范文
2014/01/13 职场文书
就业协议书怎么填
2014/04/11 职场文书
励志演讲稿300字
2014/08/21 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL