如何基于线程池提升request模块效率


Posted in Python onApril 18, 2020

普通方法:爬取梨视频

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 采集中文乱码问题的完美解决方法
Sep 27 Python
Python脚本获取操作系统版本信息
Dec 17 Python
pandas object格式转float64格式的方法
Apr 10 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
Python 互换字典的键值对实例
Feb 12 Python
python3实现单目标粒子群算法
Nov 14 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
python 字符串格式化的示例
Sep 21 Python
python xlsxwriter模块的使用
Dec 24 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
Django实现drf搜索过滤和排序过滤
Jun 21 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 #Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 #Python
jupyter notebook中美观显示矩阵实例
Apr 17 #Python
Python3将ipa包中的文件按大小排序
Apr 17 #Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 #Python
pyecharts动态轨迹图的实现示例
Apr 17 #Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 #Python
You might like
php 用sock技术发送邮件的函数
2007/07/21 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
CI框架附属类用法分析
2018/12/26 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
wxPython窗口的继承机制实例分析
2014/09/28 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
对python中的装包与解包实例详解
2019/08/24 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
2014年超市员工工作总结
2014/11/18 职场文书
银行员工考核评语
2014/12/31 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
浅析Python实现DFA算法
2021/06/26 Python
PyTorch中的torch.cat简单介绍
2022/03/17 Python
nginx七层负载均衡配置详解
2022/07/15 Servers