python并发爬虫实用工具tomorrow实用解析
作者:python学习开发 发布时间:2023-03-18 02:29:07
标签:python,并发,爬虫,工具,tomorrow
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就好.
来源:https://juejin.im/post/5bc5a27df265da0a9c78a171


猜你喜欢
- Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用
- 目录1. np.multiply()函数1.1数组场景1.2 矩阵场景2. np.dot()函数2.1 数组场景2.2 矩阵场景3. 星号(
- 如下所示:<!doctype html><html lang="en"> <head>
- 方法一:读取文件时设置代码如下:Data = pd.read_excel(level_path, sheet_name=0, encodin
- 为什么使用生产者消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者
- 大家可能有这样的体验,好比在程序里面我明明写了app.run(port=8001),结果程序还是在5000端口输出,我们右键点击py程序,直
- 1 查看当前的device输入情况:import torchprint("Default Device : {}".fo
- 1. 打开百度搜索PyCharm进入官网,我们可以看到左边是专业版,右边是社区版,建议使用专业版,功能比较齐全。2. 双击安装包进
- 本文为大家分享了mysql 8.0.15 安装配置方法,供大家参考,具体内容如下1.安装完成后在安装根目录下做一个my.ini文件my.in
- 接上篇Mysql数据库性能优化二对表进行水平划分 &nbs
- 概述固定长度,数组声明后长度便不能再修改只能存储一种特定类型元素的序列语法编号方式代码示例1直接声明var arr [3]int2makea
- 理解新概念Python V2.2 中引入了迭代器的思想。唔,这并不十分正确;这种思想的“苗头”早已出现在较老的函数 xrange() 以及文
- 给大家分享一下TensorFlow在MAC系统中的安装步骤以及环境搭建的操作流程。TensorFlow 底层的图模型结构清晰,容易改造;支持
- 本文实例讲述了Python3.5 Json与pickle实现数据序列化与反序列化操作。分享给大家供大家参考,具体如下:1、Json:不同语言
- 前言至今,ChatGPT 已经火了很多轮,我在第一轮的时候注册了账号,遗憾的是,没有彻头彻尾好好地体验过一次。最近这一次火爆,ChatGPT
- 本文实例讲述了python实现向ppt文件里插入新幻灯片页面的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: UT
- CSS中最常用的布局类属性,一个是Float(CSS浮动属性Float详解),另一个就是CSS定位属性Position。1. positio
- 根据题意理解:本质就是写分页查询:每页条数:10条;当前页码:4页;//第一种:select * from (select ROW
- 我想大家在用Sql2005一般都是.NET2005自带的SQL Server 2005是SQL Server2005 Express版本的,
- 列表(元组)基本操作符回顾len()函数在列表与元组上的使用示例如下:names = ['Neo', 'Lily