如何基于线程池提升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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
python实现K最近邻算法
Jan 29 Python
Django框架模板介绍
Jan 15 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 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中spl_autoload_register函数的用法总结
2013/11/07 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
prototype1.4中文手册
2006/09/22 Javascript
javascript之函数直接量(function(){})()
2007/06/29 Javascript
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
Python 中导入csv数据的三种方法
2018/11/01 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python 追踪except信息方式
2020/04/25 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
python 实现定时任务的四种方式
2021/04/01 Python
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers