旁白:上一篇利用python爬取了虎牙星秀的图片,这一篇利用线程池对视频进行爬取。

文章目录

  • 前言
  • 一、为什么要使用线程池?
  • 二、使用步骤
    • 1.引入模块
    • 2.创建文件夹
    • 3.存储文件
    • 4.完整代码
  • 三、运行结果
  • 总结

前言

问题:爬虫每次只能request一个url?那也太慢了吧!
解决方案:利用线程池,加快爬虫效率,节省电脑消耗。


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么要使用线程池?

系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。

线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。

此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。

二、使用步骤

1.引入模块

代码如下:

import requests
from lxml import etree
import re
import os
from multiprocessing.dummy import Pool

2.创建文件夹

代码如下:

if not os.path.exists('./li_video'):os.mkdir('./li_video')

3.存储文件

代码如下:

with open('./li_video/' + dic['video_name'], 'wb') as fp:fp.write(video_data)print(dic['video_name'], '下载完成!')

4.完整代码

代码如下:

# -*- coding: utf-8 -*-
# @Date: 2020/8/14 12:29
# @Author: Ricky Rauimport requests
from lxml import etree
import re
import os
from multiprocessing.dummy import Pooldef main():if not os.path.exists('./li_video'):os.mkdir('./li_video')     #先创建一个文件夹,用于存储视频url = 'https://www.pearvideo.com/category_59'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}dic_list = getDic(url, headers)pool = Pool(4)pool.map(get_video_data, dic_list)   #使用线程池对视频数据进行请求(主要用于处理较为耗时的阻塞操作)pool.close()   #关闭进程池,不再接受新的进程pool.join()    #主进程阻塞等待子进程的退出def getDic(url, headers):page_text = requests.get(url=url,headers=headers).texttree = etree.HTML(page_text)li_list = tree.xpath('//*[@id="listvideoListUl"]/li')video_data_list = []   #用来储存视频名称与链接for li in li_list:video_name = li.xpath('./div/a/div[2]/text()')[0] + '.mp4'detail_url = 'https://www.pearvideo.com/' + li.xpath('./div/a/@href')[0]detail_text = requests.get(url=detail_url, headers=headers).text#此处解析到的源代码(可通过开发者工具中的network进行查看),与一般的网页源代码有所差异,只能使用正则表达式进行匹配ex = 'srcUrl="(.*?)",vdoUrl=srcUrl'video_url = re.findall(ex, detail_text)[0]dic = {'video_name': video_name,'video_url': video_url}video_data_list.append(dic)return video_data_listdef get_video_data(dic):url = dic['video_url']headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}#对视频链接发起请求,获取视频的二进制数据video_data = requests.get(url=url, headers=headers).content#持久化存储操作with open('./li_video/' + dic['video_name'], 'wb') as fp:fp.write(video_data)print(dic['video_name'], '下载完成!')if __name__ == '__main__':main()

三、运行结果


总结

本文主要利用multiprocessing模块中的Pool方法,对程序进行多线程控制,同步进行多条url的访问与数据爬取,示例中是对梨视频中的<音乐栏目>进行爬取,通过运行代码,可以发现节省了大部分时间。但是,线程池的缺点在于,不能无限次的爬取,需要设定数值。

//只要在变好,慢一点也没关系//

Python爬虫:使用线程池快速下载视频相关推荐

  1. python爬虫利用线程池下载视频

    由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...

  2. 从零开始学爬虫系列4:快速下载视频

    1 前言 你知道的视频下载"姿势",有哪些吗? 本文绝对有你意想不到的玩法! 2 陈年往事 视频下载,跟图片下载其实并无差别,甚至更简单. 玩过视频下载的,应该对「you-get」 ...

  3. Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化

    大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...

  4. Python爬虫_线程池实例——北京新发地菜价

    import requests import json import jsonpath from concurrent.futures import ThreadPoolExecutor print( ...

  5. Python爬虫人工智能大数据全栈视频史上最全合辑教程分享!

    Python爬虫人工智能大数据全栈视频史上最全合辑教程分享! 毫无疑问Python是这两年最火的编程语言,不仅容易上手,且在多个行业都可应用.尤其今年人工智能及大数据的发展,Python将会展现更多的 ...

  6. Python爬虫系列之抖音热门视频爬取

    Python爬虫系列之抖音热门视频爬取 主要使用requests库以及手机抓包工具去分析接口 该demo仅供参考,已经失效,需要抖音2019年5月最新所有接口请点击这里获取 抖音资源获取接口文档请点击 ...

  7. python抓取视频违法吗,科学网—【python爬虫】抓取B站视频相关信息(一) - 管金昱的博文...

    昨天我在B站上写了这么一篇文章,但是被他们锁住了.无奈之下我复制到知乎上先保存起来 在这篇名为<三天学会用python进行简单地爬取B站网页视频数据>文章中我主要提到了两点在已知aid的情 ...

  8. 如何用迅雷下载python_使用python爬虫爬取迅雷侠下载,呵呵,你懂得

    啥也不说了,直接上代码 #!python3 import urllib.request from lxml import etree import threading from multiproces ...

  9. Python爬虫:AGE动漫下载之 requests 版

    日常跳转: 导入: 分析与代码解释: 打印搜索到的信息 BeautifelSoup4 库使用提醒 小优化 链接解析: 获取视频链接 小优化: 提示: 视频下载: 求大佬赐教 实例源码及结果 结果及下载 ...

最新文章

  1. R 语言绘制环状热图
  2. 5300亿参数,SOTA屠榜!最大NLP预训练模型新王登基,微软英伟达联手称霸
  3. php连接mssql的一些方法总结
  4. C++函数指针 学习笔记
  5. App设计灵感之十二组精美的房产App设计案例
  6. HelloWorldProxy is a factory bean
  7. 【转】01Teams的前世今生
  8. 用注册表禁止windows添加新用户
  9. JAVA输出1 10与5相乘的结果_完美起航-用java数组展示计算机的多位数相乘
  10. 经营管理类游戏_如何保持精英管理
  11. 02-虚拟机克隆配置
  12. 【CF gym 103260】40th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题
  13. cdn 内容分发 资源放在更接近用户的网络边缘
  14. win10定时关机程序
  15. android图形开发工具,Android开发实现的几何图形工具类GeometryUtil完整实例
  16. Network(无向图割点,tarjan)
  17. Eclipse工具工作环境配置/统一风格
  18. bind9 dlz mysql_源码安装Bind 9.10 正式版 开启DLZ数据库支持 和 数据库view查询
  19. 如何在iOSnbsp;8中使用Swift和Xco…
  20. wms、wmts和wfs的区别

热门文章

  1. rono在oracle的作用_rownum在oracle什么作用?
  2. knex 单表查询_SQL查询构建器 knex.js
  3. Qt编写4K/8K大分辨率播放器(8K占用1%CPU)
  4. TJA1050国产替代DP1050T高速 CAN 总线收发器
  5. GtrLib Chords Pro for Mac(吉他和弦库)
  6. csv 文件读写乱码问题的一个简单解决方法
  7. 解决Couldn‘t determine repo type for URL
  8. 电脑鼠标不管用但键盘可以用怎么办
  9. 天猫四大独门利器,助力品牌引领消费趋势
  10. appinventor拓展开发