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多进程机制实例详解
Jul 02 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
Python利用字典破解WIFI密码的方法
Feb 27 Python
详解python中init方法和随机数方法
Mar 13 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
Python绘制地图神器folium的新人入门指南
May 23 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加MYSQL服务器
2006/10/09 PHP
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python学生信息管理系统实现代码
2019/12/17 Python
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
社团文化节邀请函
2014/01/10 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
护士自荐信范文
2015/03/25 职场文书
婚宴父亲致辞
2015/07/27 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js