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 enumerate遍历数组示例应用
Sep 06 Python
python获取标准北京时间的方法
Mar 24 Python
Python实现处理管道的方法
Jun 04 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Python3 处理JSON的实例详解
Oct 29 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
Python 图片处理库exifread详解
Feb 25 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python使用psutil模块获取系统状态
2016/08/27 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
给朋友的道歉信
2014/01/09 职场文书
党支部书记先进事迹
2014/01/17 职场文书
一年级学生评语
2014/04/23 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
python OpenCV学习笔记
2021/03/31 Python
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS
python计算列表元素与乘积详情
2022/08/05 Python