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素数检测的方法
May 11 Python
Python脚本处理空格的方法
Aug 08 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
django中静态文件配置static的方法
May 20 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
django如何自己创建一个中间件
Jul 24 Python
Python的条件锁与事件共享详解
Sep 12 Python
python操作cfg配置文件方式
Dec 22 Python
Python中求对数方法总结
Mar 10 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
使用python创建股票的时间序列可视化分析
Mar 03 Python
Python 图片添加美颜效果
Apr 28 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使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
教大家制作简单的php日历
2015/11/17 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
让焦点自动跳转
2006/07/01 Javascript
兼容ie和firefox js关闭代码
2008/12/11 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python生成pdf文件的方法
2014/08/04 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
python 列表降维的实例讲解
2018/06/28 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
python三引号输出方法
2019/02/27 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
档案室主任岗位职责
2014/02/12 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
终止劳动合同通知书
2015/04/16 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
小学中队委竞选稿
2015/11/20 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书