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实现的ini文件操作类分享
Nov 20 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
Python内建模块struct实例详解
Feb 02 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
python tkinter窗口最大化的实现
Jul 15 Python
Python笔记之代理模式
Nov 20 Python
python的range和linspace使用详解
Nov 27 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
Python字典和列表性能之间的比较
Jun 07 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-fpm的配置详解
2013/06/03 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
php的一个简单加密解密代码
2014/01/14 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
微信小程序 转发功能的实现
2017/08/04 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
python实现网站的模拟登录
2016/01/04 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python 统计字数的思路详解
2018/05/08 Python
Sanic框架流式传输操作示例
2018/07/18 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python中实现栈的三种方法
2020/12/19 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
大专生毕业的自我评价
2014/02/06 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
保护野生动物倡议书
2014/05/16 职场文书
公司股东合作协议书
2014/09/14 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python