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对象的深拷贝和浅拷贝详解
Aug 25 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python实现识别手写数字大纲
Jan 29 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
对pandas中Series的map函数详解
Jul 25 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
django 环境变量配置过程详解
Aug 06 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
python实现黄金分割法的示例代码
Apr 28 Python
Python3 类型标注支持操作
Jun 02 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
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
python程序 创建多线程过程详解
2019/09/23 Python
python实现快递价格查询系统
2020/03/03 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
详解python with 上下文管理器
2020/09/02 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
ipad隐藏软件app图标方法
2022/04/19 数码科技
Nginx利用Logrotate实现日志分割
2022/05/20 Servers