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利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
django实现用户登陆功能详解
Dec 11 Python
基于python requests库中的代理实例讲解
May 07 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
python使用tornado实现登录和登出
Jul 28 Python
Python子类继承父类构造函数详解
Feb 19 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
Python操作SQLite数据库过程解析
Sep 02 Python
如何在django中运行scrapy框架
Apr 22 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
python3让print输出不换行的方法
Aug 24 Python
Python中os模块的简单使用及重命名操作
Apr 17 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面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python3中str(字符串)的使用教程
2017/03/23 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
EJB面试题
2015/07/28 面试题
高校毕业生登记表自我鉴定
2013/11/03 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
公司离职证明范本
2014/01/13 职场文书
年会活动策划方案
2014/01/23 职场文书
运动会领导邀请函
2014/02/05 职场文书
学生上课说话检讨书
2014/10/25 职场文书
婚前保证书范文
2015/02/28 职场文书
鸦片战争观后感
2015/06/09 职场文书
北京青年观后感
2015/06/15 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
vue里使用create, mounted调用方法
2022/04/26 Vue.js