如何基于线程池提升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 13 Python
Python复制目录结构脚本代码分享
Mar 06 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
Python中的字符串替换操作示例
Jun 27 Python
python实现K最近邻算法
Jan 29 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
python 为什么说eval要慎用
Mar 26 Python
Django框架 querySet功能解析
Sep 04 Python
Python语言异常处理测试过程解析
Jan 08 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
2021年最新用于图像处理的Python库总结
Jun 15 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
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php程序内部post数据的方法
2015/03/31 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
php socket通信简单实现
2016/11/18 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
公司联欢会策划方案
2014/05/19 职场文书
科技活动总结范文
2015/05/11 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB