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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
简单介绍Python中的floor()方法
May 15 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python之父谈Python的未来形式
Jul 01 Python
快速查询Python文档方法分享
Dec 27 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python动态强类型解释型语言原理解析
Mar 25 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP使用递归生成文章树
2015/04/21 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
php xhprof使用实例详解
2019/04/15 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
再谈javascript原型继承
2014/11/10 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
家长写给孩子的评语
2014/04/18 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
品质口号大全
2014/06/17 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
政府四风问题整改措施
2014/10/04 职场文书
2014年财务科工作总结
2014/11/11 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS