如何基于线程池提升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实现全局变量的两个解决方法
Jul 03 Python
简单谈谈python中的多进程
Nov 06 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
分分钟入门python语言
Mar 20 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
python实现简单的文字识别
Nov 27 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
Django的models模型的具体使用
Jul 15 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
详解MindSpore自定义模型损失函数
Jun 30 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程序的方法小结
2012/02/23 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
机关保密承诺书
2014/06/03 职场文书
关于运动会的广播稿
2014/09/22 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript