提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、需求分析
- 二、具体实现步骤
-
- 1.获取页面的ajax响应,观察参数特点
- 2.获取响应数据
- 3.开始数据解析,获得详情页url和视频名称
- 4.获取视频的下载url(获取到的是假的url)
- 5.使用线程池实现异步下载视频
- 三、完整代码
一、需求分析
1.页面数据是通过ajax请求得到的,也就是向下翻页时视频数据加载,并不是一开始加载全部数据
2.视频下载地址的获取(此案例中通过抓包工具抓到的下载地址是假的,需要进行处理)
3.使用线程池实现异步操作
二、具体实现步骤
1.获取页面的ajax响应,观察参数特点
从上图可知,前两个参数是固定的,start是以12为步长
2.获取响应数据
代码如下:
url="https://www.pearvideo.com/category_loading.jsp?" header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44' } param={ 'reqType':'5', 'categoryId': '5', 'start': '12', 'mrd': str(random.random()) } resp=requests.get(url=url,headers=header,params=param).text
获得相应如下:
3.开始数据解析,获得详情页url和视频名称
tree=etree.HTML(resp) vedio_name=tree.xpath('//div [@class="vervideo-title"]/text()') li_list=tree.xpath('//div [@class="vervideo-bd"]') for li in li_list: adress="https://www.pearvideo.com/"+li.xpath('./a/@href')[0] title=li.xpath('.//div [@class="vervideo-title"]/text()')[0]
4.获取视频的下载url(获取到的是假的url)
在视频播放的时候,观察页面源代码,可以发现真实的下载url:“https://video.pearvideo.com/mp4/third/20220623/cont-1766067-11980839-150732-hd.mp4”
从ajax包中抓取到的假的url:“https://video.pearvideo.com/mp4/third/20220623/1657767284808-11980839-150732-hd.mp4”
对比二者的url,可以发现真实的url比假的url多了一个cont-17660667
这就是加密的一种方式
需要对获取到假url进行处理
##获取假的url def get_fack_url(vedio_id): url="https://www.pearvideo.com/videoStatus.jsp?" header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44', 'Referer': 'https://www.pearvideo.com/video_' + vedio_id } params = { 'contId': vedio_id, 'mrd': str(random.random()) } resp=requests.get(url=url,headers=header,params=params).json() fack_url=resp["videoInfo"]['videos']["srcUrl"] return fack_url
##通过字符串的处理获得正确的下载地址 def get_real_url(fack_url,vedio_id): s_r=fack_url[47:–23] real_url=fack_url.replace(s_r,"cont-"+vedio_id) return real_url
5.使用线程池实现异步下载视频
1.构建线程池
pool=Pool(len(li_list)) pool.map(download_vedio,real)
2.下载视频
def download_vedio(dic): real_url=dic['real_url'] name=dic['name'] resp=requests.get(url=real_url,headers=header).content print(name+".mp4","开始下载") vedio_path='./MyPearVideo/'+name+'.mp4' with open(vedio_path,'wb') as fp: fp.write(resp) print(name+".mp4","下载完毕")
三、完整代码
start=time.time() url="https://www.pearvideo.com/category_loading.jsp?" header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44' } if not os.path.exists('./MyPearVideo'): os.mkdir('./MyPearVideo') real=[] def get_fack_url(vedio_id): url="https://www.pearvideo.com/videoStatus.jsp?" header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44', 'Referer': 'https://www.pearvideo.com/video_' + vedio_id } params = { 'contId': vedio_id, 'mrd': str(random.random()) } resp=requests.get(url=url,headers=header,params=params).json() fack_url=resp["videoInfo"]['videos']["srcUrl"] return fack_url def get_real_url(fack_url,vedio_id): s_r=fack_url[47:–23] real_url=fack_url.replace(s_r,"cont-"+vedio_id) return real_url def download_vedio(dic): real_url=dic['real_url'] name=dic['name'] resp=requests.get(url=real_url,headers=header).content print(name+".mp4","开始下载") vedio_path='./MyPearVideo/'+name+'.mp4' with open(vedio_path,'wb') as fp: fp.write(resp) print(name+".mp4","下载完毕") for index in range(12,121,12): print("第",index//12,"开始下载") param={ 'reqType':'5', 'categoryId': '5', 'start': str(index), 'mrd': str(random.random()) #'filterIds': '1767354,1767387,1767351,1765856,1765869,1765737,1765731,1765721,1765677,1765685,1765689,1765706,1765701,1765696,1765692' } resp=requests.get(url=url,headers=header,params=param).text tree=etree.HTML(resp) vedio_name=tree.xpath('//div [@class="vervideo-title"]/text()') li_list=tree.xpath('//div [@class="vervideo-bd"]') for li in li_list: adress="https://www.pearvideo.com/"+li.xpath('./a/@href')[0] title=li.xpath('.//div [@class="vervideo-title"]/text()')[0] vedio_id=adress.split('_')[1] fack_url=get_fack_url(vedio_id) real_url=get_real_url(fack_url,vedio_id) dic={ 'name':title, 'real_url':real_url } real.append(dic) pool=Pool(len(li_list)) pool.map(download_vedio,real) end=time.time() print(end–start)
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试