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实现异步回调机制代码分享
Jan 10 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
Python中模块与包有相同名字的处理方法
May 05 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
python yield和Generator函数用法详解
Feb 10 Python
动态设置django的model field的默认值操作步骤
Mar 30 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
python sleep和wait对比总结
Feb 03 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
laravel入门知识点整理
2020/09/15 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
keras.layer.input()用法说明
2020/06/16 Python
Django中ORM的基本使用教程
2020/12/22 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
10条PHP编程习惯
2014/05/26 面试题
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
如何写好升职自荐信
2014/01/06 职场文书
新员工入职感言
2014/02/01 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
小平小道观后感
2015/06/09 职场文书