如何基于线程池提升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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
python中遍历文件的3个方法
Sep 02 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Python使用xpath实现图片爬取
Sep 16 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
5款实用的python 工具推荐
Oct 13 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 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动态创建Flash动画
2006/10/09 PHP
php 日期时间处理函数小结
2009/12/18 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
strstr()的简单实现
2013/09/26 面试题
关于赌博的检讨书
2014/01/08 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Django实现聊天机器人
2021/05/31 Python
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL