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脚本来获取Google搜索结果的示例
May 04 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
numpy中索引和切片详解
Dec 15 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
Python求解排列中的逆序数个数实例
May 03 Python
python可以用哪些数据库
Jun 22 Python
python 实现ping测试延迟的两种方法
Dec 10 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
十天学会php之第三天
2006/10/09 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP 中文处理技巧
2010/04/25 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
js实现烟花特效
2020/03/02 Javascript
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python中如何使用虚拟环境
2020/10/14 Python
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
婚前协议书怎么写
2014/04/15 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
民主生活会发言材料
2014/10/20 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
好媳妇事迹材料
2014/12/24 职场文书
技术支持岗位职责
2015/02/13 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis