网络爬虫xpath实战案例

336次阅读
没有评论

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、需求分析
  • 二、具体实现步骤
    • 1.获取页面的ajax响应,观察参数特点
    • 2.获取响应数据
    • 3.开始数据解析,获得详情页url和视频名称
    • 4.获取视频的下载url(获取到的是假的url)
    • 5.使用线程池实现异步下载视频
  • 三、完整代码

一、需求分析

1.页面数据是通过ajax请求得到的,也就是向下翻页时视频数据加载,并不是一开始加载全部数据
2.视频下载地址的获取(此案例中通过抓包工具抓到的下载地址是假的,需要进行处理)
3.使用线程池实现异步操作

二、具体实现步骤

1.获取页面的ajax响应,观察参数特点

网络爬虫xpath实战案例网络爬虫xpath实战案例
从上图可知,前两个参数是固定的,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


获得相应如下:
网络爬虫xpath实战案例

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(endstart)

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-28发表,共计4675字。
新手QQ群:570568346,欢迎进群讨论 Python51学习