如何基于线程池提升request模块效率
作者:返回主页人生苦短,我用python 发布时间:2023-06-12 11:13:44
标签:线程池,request,模块
普通方法:爬取梨视频
import re
import time
import random
import requests
from lxml import etree
start_time = time.time()
url = "https://www.pearvideo.com/category_3"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
}
ex = 'srcUrl="(.*?)",vdoUrl=srcUrl'
def request_video(url):
"""
向视频链接发送请求
"""
return requests.get(url=url, headers=headers).content
def save_video(content):
"""
将视频的二进制数据保存到本地
"""
video_name = str(random.randint(100, 999)) + ".mp4"
with open(video_name, 'wb') as f:
f.write(content)
# 获取首页源码
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@class="listvideo-list clearfix"]/li')
video_url_list = list()
for li in li_list:
detail_url = "https://www.pearvideo.com/" + li.xpath('./div/a/@href')[0]
# 获取该视频页面的源码
detail_page_text = requests.get(url=detail_url, headers=headers).text
# 正则匹配视频的URL
video_url = re.findall(ex, detail_page_text, re.S)[0]
video_url_list.append(video_url)
content = request_video(video_url)
save_video(content)
print("执行耗时: ", time.time() - start_time)
执行耗时: 147.22410440444946
使用线程池:爬取梨视频
# 使用线程池爬去梨视频的
import re
import time
import random
import requests
from lxml import etree
from multiprocessing.dummy import Pool
start_time = time.time()
url = "https://www.pearvideo.com/category_3"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
}
ex = 'srcUrl="(.*?)",vdoUrl=srcUrl'
def request_video(url):
"""
向视频链接发送请求
"""
return requests.get(url=url, headers=headers).content
def save_video(content):
"""
将视频的二进制数据保存到本地
"""
video_name = str(random.randint(100, 999)) + ".mp4"
with open(video_name, 'wb') as f:
f.write(content)
# 获取首页源码
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@class="listvideo-list clearfix"]/li')
video_url_list = list()
for li in li_list:
detail_url = "https://www.pearvideo.com/" + li.xpath('./div/a/@href')[0]
# 获取该视频页面的源码
detail_page_text = requests.get(url=detail_url, headers=headers).text
# 正则匹配视频的URL
video_url = re.findall(ex, detail_page_text, re.S)[0]
video_url_list.append(video_url)
pool = Pool(4)
#使用线程池将视频的二进制数据下载下来
content_list = pool.map(request_video, video_url_list)
# 使用线程池将视频的二进制数据保存到本地
pool.map(save_video, content_list)
print("执行耗时: ", time.time() - start_time)
来源:https://www.cnblogs.com/youhongliang/p/12708250.html


猜你喜欢
- 很久以前做的东西,发出来大家玩玩!<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
- 女友让我给她论文的图片上加上字母序号,本来觉得是个很简单的事情,但那个白底黑字的圆圈序号却难住了我, 试了几个常用的软件,都不行。后来用 P
- 1.数据结构说明:数据结构如下:modification字段为修改数据时间字段,格式为 年,月,日,时,分,秒。案例场景为,根据modifi
- wlile循环while True表示永远为真,不管是什么条件都会向下执行,下面是写的一个例子。#!/usr/bin/env pythona
- 1.if语句Python 中的if子句看起来十分熟悉. 它由三部分组成: 关键字本身, 用于判断结果真假的条件表达式, 以及当表达式为真或者
- 前言目前,许多运动检测技术都是基于简单的背景差分概念的,即假设摄像头(视频)的曝光和场景中的光照条件是稳定的,当摄像头捕捉到新的帧时,我们可
- 上篇文章分享了windows下载mysql5.7压缩包配置安装mysql后续可以选择①在本地创建一个数据库,使用navicat工具导出远程测
- 当我们想更新一张动态表的时候(即:表中的数据不断的添加),也许我们会用数据库代理,通过写作业,然后让他定时查询动态表中最新添加的数据,然后更
- Bit-Packed Data TypesMySQL有一些存储类型使用一个值中的一些单个的比特位来紧凑的存储数据。纯技术上将,不管是底层的存
- 前言很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多,关于校验模型准确度的指标主要有混淆矩阵、准确率、精确率、
- 发送普通邮件发送文本和html普通邮件如下:from email.header import Headerfrom email.mime.t
- 如果你能很好的理解我下面的一句话,那这些都不是问题了。asp是服务器端语言,它的作用是动态生成客户端浏览器所能识别的html css jav
- 日志文件满而造成SQL数据库无法写入文件时,可用两种方法:一种方法:清空日志。1.打开查询分析器,输入命令DUMP TRANSAC
- SOLyog的下载、安装以及使用很简单。我去了相关网站下载,它只有384K字节大小。它把两个文件(一个可执行文件.exe和一个动态链接库文件
- 交叉表(cross-tabulation,简称crosstab)是⼀种⽤于计算分组频率的特殊透视表。语法详解:pd.crosstab(ind
- Django是一种基于Python的Web开发框架一、在命令行中创建Django项目(Windows平台、python3.6)1、建立虚拟环
- 4 月 27 日,GitHub 趋势榜第 3 位是一个用 Python 编码实现的算法库,Star 数早已达到 26000+链接:https
- 数据库中IP地址数据该怎么存?或许你已经不止一次遇到过这类问题,怎么存?varchar(255)不就完事儿了?坦白说,在我经历的几个项目中,
- 具体错误:UnicodeEncodeError: 'latin-1' codec can't encode char
- 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供