如何基于线程池提升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通过ftplib登录到ftp服务器的方法
May 08 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
Python找出9个连续的空闲端口
Feb 01 Python
python实现用户答题功能
Jan 17 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
Python使用while循环花式打印乘法表
Jan 28 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Python Tkinter实例——模拟掷骰子
Oct 24 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
如何做到多笔资料的同步
2006/10/09 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
jquery实现动态画圆
2014/12/04 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
如何利用python生成MD5并去重
2020/12/07 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
现金出纳岗位职责
2014/03/15 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers