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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python素数检测的方法
May 11 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
python中threading开启关闭线程操作
May 02 Python
Django REST Swagger实现指定api参数
Jul 07 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
隐性调用php程序的方法
2015/06/13 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
详解vue组件开发脚手架
2018/06/15 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
创业计划书中要认真思考的问题
2013/12/28 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
社区文化建设方案
2014/05/02 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
给男朋友的道歉短信
2015/05/12 职场文书