如何基于线程池提升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设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
python flask解析json数据不完整的解决方法
May 26 Python
python3实现弹弹球小游戏
Nov 25 Python
django中ImageField的使用详解
Dec 21 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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运行时动态创建函数的方法
2015/03/16 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python中如何使用insert函数
2020/01/09 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
基于matplotlib xticks用法详解
2020/04/16 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
幼儿园毕业典礼主持词
2014/03/21 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js