如何基于线程池提升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中内置的NotImplemented类型的用法
Mar 31 Python
python实现类的静态变量用法实例
May 08 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
Python两个字典键同值相加的几种方法
Mar 05 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
使用Django清空数据库并重新生成
Apr 03 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python绘制云雨图raincloud plot
Aug 05 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教程 预定义变量
2009/10/23 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
js继承的实现代码
2010/08/05 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
js随机生成26个大小写字母
2016/02/12 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
python如何进行矩阵运算
2020/06/05 Python
python名片管理系统开发
2020/06/18 Python
简单的命令查看安装的python版本号
2020/08/28 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
单位人事专员介绍信
2014/01/11 职场文书
领导证婚人证婚词
2014/01/13 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL