如何基于线程池提升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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
Python Socket编程之多线程聊天室
Jul 28 Python
python画微信表情符的实例代码
Oct 09 Python
keras 权重保存和权重载入方式
May 21 Python
Django REST 异常处理详解
Jul 15 Python
如何解决pycharm调试报错的问题
Aug 06 Python
python tkinter实现连连看游戏
Nov 16 Python
python爬虫基础之urllib的使用
Dec 31 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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
第八节 访问方式 [8]
2006/10/09 PHP
php实现json编码的方法
2015/07/30 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
发现的以前不知道的函数
2006/09/19 Javascript
关于Javascript 的 prototype问题。
2007/01/03 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
Python模拟登录12306的方法
2014/12/30 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python 异或加密字符串的实例
2018/10/14 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
晚会邀请函范文
2014/01/24 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
总账会计岗位职责
2015/04/02 职场文书
考试没考好检讨书
2015/05/06 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL