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代理抓取并验证使用多线程实现
May 03 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
浅析python的优势和不足之处
Nov 20 Python
django使用LDAP验证的方法示例
Dec 10 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
Python netmiko模块的使用
Feb 14 Python
python实现小程序推送页面收录脚本
Apr 20 Python
python轮询机制控制led实例
May 03 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
python基础详解之if循环语句
Apr 24 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导入大量数据到mysql性能优化技巧
2014/12/29 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
js对象的比较
2011/02/26 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
js使用心得分享
2015/01/13 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
JS实现页面打印功能
2017/03/16 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python版微信红包分配算法
2015/05/04 Python
Python学习思维导图(必看篇)
2017/06/26 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
python使用正则筛选信用卡
2019/01/27 Python
浅析python的Lambda表达式
2019/02/27 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python实现人像动漫化的示例代码
2020/05/17 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
一套SQL笔试题
2016/08/14 面试题
房地产开盘策划方案
2014/02/10 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
2015年林业工作总结
2015/05/14 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书