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实现dnspod自动更新dns解析的方法
Feb 14 Python
python处理文本文件实现生成指定格式文件的方法
Jul 31 Python
理解Python中函数的参数
Apr 27 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
python制作填词游戏步骤详解
May 05 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
python中如何设置代码自动提示
Jul 15 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 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通用检测函数集合
2006/11/25 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中isnumeric()方法的使用简介
2015/05/19 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
高三高考决心书
2014/03/11 职场文书
研究生导师推荐信
2015/03/25 职场文书
推广普通话的宣传语
2015/07/13 职场文书
运动会新闻报道稿
2015/07/22 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL