小白尝试用刚学到的线程池对梨视频音乐专栏下的最热板块的四个视频进行异步爬取,参考B站教学视频和各位大佬的指点终于运行成功!!!​​​​

目录

文章目录

前言

一、难点

二、使用步骤

1. 引入库

2. 爬取数据及数据解析

3. 使用线程池进行批量下载

总结



前言

线程池是异步爬虫方法的一种,可以避免较为耗时的阻塞操作,提高效率。

一、难点

对于我这种初学者而言,爬取梨视频网站的难点在于单个视频的url是经过加密的,需要通过观察对比其结构,从而破解加密方式,获取真正的url。

二、使用步骤

1. 引入库

代码如下(示例):

import requests
import os
import random
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool

2. 爬取数据及数据解析

这一步主要是为了获取单个视频真正的url。

代码如下(示例):

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29"
}
# 原则:线程池处理的是阻塞且耗时的操作
# 对下述url发起请求,解析出视频详情页的url和视频名称
# 请求页面数据
url = "https://www.pearvideo.com/category_59"
response = requests.get(url=url, headers=headers)
page_text = response.text# 对页面数据进行xpath解析
tree = etree.HTML(page_text)
li_list = tree.xpath("//ul[@id='listvideoListUl']/li")
videos = []  # 用来存储视频的标题和链接
for li in li_list:# 分别解析出每个视频详情页的链接和视频的标题# 注意:视频链接不完整,需要拼接detail_url = "https://www.pearvideo.com/" + li.xpath("./div/a/@href")[0]# 获取的标题文本,后面加上视频格式后缀".mp4"detail_title = li.xpath("./div/a/div[2]/text()")[0] + '.mp4'# 对详情页的url发请求并获取响应数据detail_page_text = requests.get(url=detail_url, headers=headers).text# 得到的数据是动态加载的,这个一定要验证一下response# 去掉问号后面用&连接的两个参数ajax_url = "https://www.pearvideo.com/videoStatus.jsp?"# 从前面详情页数据中解析出的"video_1746440"中分离出1746440这一部分,作为params中的contIdcont_Id = li.xpath("./div/a/@href")[0].split("_")[-1]# 封装好get请求的参数,"mrd"是一个介于0和1之间的随机数,用random模块下的random()方法,注意要转成字符串类型params = {"contId": cont_Id, "mrd": str(random.random())}# 请求头中要加上Referer,这个和params中的contId都是动态的,且需要拼接# 加了'Referer': 'https://www.pearvideo.com/video_1746440'后就不会显示该文章已下架了ajax_headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29","Referer":"https://pearvideos.com/video_" + cont_Id}# 对ajax中的视频链接发起请求,并获取响应数据,注意响应数据的类型是json类型,返回的是一个字典!!ajax_data = requests.get(url=ajax_url, params=params, headers=ajax_headers).json()# 可以查看抓包工具--network--XHR--response,发现返回的结果是三层字典,需要一层一层地把视频地址srcUrl给剥出来video_url = ajax_data["videoInfo"]['videos']["srcUrl"]# print(video_url)  用于验证是否能爬取到url,成功!!# 但解析出来的视频地址是一个加密后的伪地址,需要将中间的一串13位数字改成cont-cont_id,方可得到真地址# 伪地址:https://video.pearvideo.com/mp4/third/20211123/1638172217395-12719568-193109-hd.mp4# 真地址:https://video.pearvideo.com/mp4/third/20211123/cont-1746440-12719568-193109-hd.mp4# 下面开始替换字符(俺不会正则QAQ,一直匹配不了ORZ)# 先将伪地址用"/"切割为列表,['https:', '', 'video.pearvideo.com', 'mp4', 'third', '20211123', '1638180827144-12719568-193109-hd.mp4']list1 = video_url.split("/")# 取出列表中的最后一个字符串:'1638180827144-12719568-193109-hd.mp4',将其用"-"切割为列表# ['1638180827144', '12719568', '193109', 'hd.mp4']list2 = list1[-1].split("-")# 用"cont-1746440"替换掉列表中的第一个字符串:'1638180827144'list2[0] = "cont-" + cont_Id# 用-把list2中的元素连接成一个字符串再替换list1中的最后一个元素list1[-1] = "-".join(list2)# 再将list1中的元素连成一个字符串就搞定了video_url_valid = "/".join(list1)# print(video_url_valid)  测试无误!!!# 将视频标题和链接封装到字典中video_info = {"Name": detail_title, "Url": video_url_valid}# 将单个视频的信息的字典存储到列表中videos.append(video_info)

3. 使用线程池进行批量下载

代码如下(示例):

# 如果文件夹不存在则创建文件夹,用来放视频
if not os.path.exists("./pearvideos"):os.mkdir("./pearvideos")# 定义一个下载视频的函数
def download_video(dic):# 提示进度print(f"{dic['Name']} 正在下载......")# 向视频链接发送请求u = dic["Url"]video_data = requests.get(url=u, headers=headers).content# 持久化存储# with open()是上下文管理器,不需要手动进行close()关闭操作,写入二进制数据的时候,要用wb模式打开with open(f"pearvideos/{dic['Name']}", "wb") as fp:fp.write(video_data)print(f"{dic['Name']} 下载成功!!!")# 使用线程池对视频数据进行请求(较为耗时的阻塞操作)
pool = ThreadPool(4)  # 声明一个Pool对象,子线程数为4
pool.map(download_video, videos)  # 函数为download_videos, 将列表videos中的各字典元素作为函数的参数
# 关闭子线程
pool.close()
# 关闭主线程
pool.join()

4. 运行结果

如下:

中国以色列艺术家联袂上演“共·生”.mp4 正在下载......
郁可唯《路过人间》每一句都戳中人心,沉浸在情感与故事之中.mp4 正在下载......
毛不易一首《牧马城市》唱出了城市人的生活和迷茫.mp4 正在下载......
燃到极致是温柔!《孤勇者》吉他指弹.mp4 正在下载......
郁可唯《路过人间》每一句都戳中人心,沉浸在情感与故事之中.mp4 下载成功!!!
中国以色列艺术家联袂上演“共·生”.mp4 下载成功!!!
毛不易一首《牧马城市》唱出了城市人的生活和迷茫.mp4 下载成功!!!
燃到极致是温柔!《孤勇者》吉他指弹.mp4 下载成功!!!

下载好的视频:


总结

以上就是今天要讲的内容,本文只是基于教学视频和个人理解尝试的实例操作,诸多不足之处,敬请大佬们指教!!

使用线程池批量爬取梨视频最热视频相关推荐

  1. Python爬虫实战 使用线程池批量爬取必应1080P高清壁纸

    本文纯粹为了技术学习,内容如有侵权,请告知! 目标URL:https://bing.ioliu.cn 爬取的图片 Python用到的主要模块 import requests from lxml imp ...

  2. 升级完善第一个爬虫GCZW3,使能够批量爬取多篇文章热评

    前天写了观察者网的爬虫,只能根据某个网页链接爬取,不能一次性大量爬取多篇文章的热门评论. 于是,今天想把它升级一下,让它可以从首页获取首页展示的所有文章的链接,并分别进行爬取. 于是写了mainPag ...

  3. python爬取地图上的经纬度_使用高德开放平台api批量爬取所需经纬度及位置信息(平台教程和python多进程、多线程代码详解)...

    2019.3.20更新(将代码升级为非阻塞式多进程,效率极大提升) 2019.6.28更新 (将代码模块化,复用性更强,使用更高效的线程池进行爬取) 之前写爬虫对链家某地区全部二手房信息进行了获取并存 ...

  4. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  5. python爬取抖音用户数据_python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  6. json spr路驾驶技术视频api_每天弄个小爬取之Python爬取批量爬取B站小视频

    1. 批量爬取B站小视频 哔哩哔哩网站(英文名称: bilibili),是年轻人的文化社区,被粉丝们亲切的称为B站.该网站中拥有动画.番剧.国创.音乐.舞蹈.游戏.科技.生活.鬼畜.娱乐.时尚等多个内 ...

  7. Python每日一练(9)-批量爬取B站小视频

    目录 1. 批量爬取B站小视频 2. 获取动态请求的JSON数据 3. 随机生成浏览器的头部信息 4. 获取要下载视频的大小 5. 实时打印文件下载进度 1. 批量爬取B站小视频 哔哩哔哩网站(英文名 ...

  8. Python爬虫学习,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙 项目源码展示 ''' 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料, ...

  9. Python爬虫学习教程,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目源码展示: ''' 在学习过程中有什么不懂得可以加我的 python学习交流扣扣qu ...

最新文章

  1. 原生JS修改html内容不影响绑定的点击事件 请认准insertAdjacentHTML、insertAdjacentText方法
  2. h5 getUserMedia error PermissionDeniedError
  3. python write非法字符报错_Python爬虫实现的微信公众号文章下载器
  4. insight切换窗口 source_Source Insight函数调用关系显示设置(示例代码)
  5. 使用pip来安装pyOpenSSL
  6. uniapp开发微信小程序时,报错:Now you can provide attr `wx:key` for a `wx:for` to improve performance
  7. react(91)--debugger
  8. CSDN博客如何调整文字的字体、大小、颜色
  9. 大数据认证为什么学python_大数据为什么需要学python?
  10. (19)ISE14.7软件生成bit失败永久解决方法(FPGA不积跬步101)
  11. xtrabackup备份mysql_xtrabackup备份mysql
  12. 强悍的 ubuntu —— 查看软件版本及安装位置
  13. DSP实验报告—实验 4  编写一个汇编和 C 混合的 DSP 程序
  14. cfa equity
  15. 单元一: 全桥驱动电路(驱动MOS/IGBT均适用,附带硬件)
  16. 椭圆部分面积计算公式及微积分推导过程
  17. 测试固态硬盘寿命软件,SSD能用多久在哪看 检测固态硬盘寿命方法
  18. 网站采集器,网站采集工具(图文教程)
  19. wifi文件服务器地址,wifi是服务器地址
  20. 【翻译】使用Sencha Ext JS创建美丽的图画(1)

热门文章

  1. GNU Bison 2.1 中文手册
  2. PE、PM、PD、PR分别是什么岗位?
  3. 中考词汇测试软件,百词斩中考版
  4. split和ubound函数的用法
  5. 思科三层交换机配置DHCP中继
  6. 如何将一个逻辑库下所有数据集的名称汇总生成新的数据集BY:crackman
  7. uva 11800 Determine the Shape
  8. 优达学城计算机视觉pkl,优达学城机器学习工程师纳米学位项目介绍
  9. MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧
  10. 网络安全能力认证CCSC技术Ⅰ级认证培训