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 17 Python
python任务调度实例分析
May 19 Python
Python简单计算文件夹大小的方法
Jul 14 Python
python直接访问私有属性的简单方法
Jul 25 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
对python中的for循环和range内置函数详解
Apr 17 Python
Python 修改列表中的元素方法
Jun 26 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
Python函数式编程实例详解
Jan 17 Python
Python检测端口IP字符串是否合法
Jun 05 Python
python实现斗地主分牌洗牌
Jun 22 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 mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
python控制台显示时钟的示例
2014/02/24 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python sorted对list和dict排序
2020/06/09 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
招商经理岗位职责
2013/11/16 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
校车安全管理责任书
2015/05/11 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
婚宴领导致辞
2015/07/28 职场文书
使用Python开发冰球小游戏
2022/04/30 Python