如何基于线程池提升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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
Python给图像添加噪声具体操作
Mar 03 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
python 函数中的内置函数及用法详解
Jul 02 Python
简单了解python变量的作用域
Jul 30 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
python代码如何实现余弦相似性计算
Feb 09 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
Python实现双向链表
May 25 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
javascript 写类方式之五
2009/07/05 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
解决Mac node版本升级失败的问题
2018/05/16 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python从单元素字典中获取key和value的实例
2018/12/31 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
python实现电子书翻页小程序
2019/07/23 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
毕业证丢失证明范本
2014/09/20 职场文书
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers