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 10 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
python操作xlsx文件的包openpyxl实例
May 03 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
python使用requests.session模拟登录
Aug 09 Python
浅析python 动态库m.so.1.0错误问题
May 09 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
浅谈Python3中print函数的换行
Aug 05 Python
通过代码实例了解Python sys模块
Sep 14 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 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/10/09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
php实现删除空目录的方法
2015/03/16 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
js 事件小结 表格区别
2007/08/13 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python 将pdf转成图片的方法
2018/04/23 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
error和exception有什么区别
2012/10/02 面试题
银行演讲稿范文
2014/01/03 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
mysql死锁和分库分表问题详解
2021/04/16 MySQL
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle