梨视频爬取攻略

梨视频爬取攻略

思路

1.打开网址查看数据加载方式,具体步骤是打开网络源码查看视频数据是否存在
2.存在为直接加载,不存在为js动态申请,发现数据为js动态加载
3.打开network查看url地址,请求方式,视频文件多为get请求
4.获取首页所有详细页面地址后,执行循环向详细页面地址发送请求
5.进入详细页面时,查看视频加载方式
6.network查看url地址,请求方式,请求体或请求头文件
systemTime
srcUrl
7.获取信息后,发现不是视频数据
8.再对请求结果的观察中发现真实地址与请求结果地址有相似的地方,但也有不同的地方
9.通过特定的值将请求结果地址替换为真实地址,利用视频ID与systemTIme进行替换,就可以发送求获得视频
10.梨视频存在防爬链,需要在请求返回值中查找referer键值对
11.将referer键值对,作为请求头加入请求
12.向视频的地址发送请求获取视频信息
13.最好设置时间间隔,不要太频繁

实际操作

调用模块

import requests
'''
requests模块主要用于网络请求获取数据,请求方式主要为get和post,本次实验会用到get
'''
from bs4 import BeautifulSoup
'''
从bs4集合中获取BeautifulSoup,其主要识别'html'和'lxml'的文本内容,并且有多个选择器可以筛选结果
'''
import os
'''
os模块运用于操作文本格式的文件
'''

进入官网查看,查看数据请求方式,右键检查,发现是间接加载

     按f12或右键检查呼出后端界面。查看network,需要下拉或刷新页面获取请求信息,可以看到url和请求方式,在Paramerters中categoryld是用来定义视频的种类,start为页面视频数量,为12的倍数,我们可以通过在请求头中对这些数据进行更改,来获得多个视频的量

# 发送get请求网址
res=requests.get('https://www.pearvideo.com/category_9',
                 params={"reqType": 5,
                         "categoryId": 9,
                         "start":page_id})
# 构造解析对象
soup=BeautifulSoup(res.text,'lxml')
# 获取li列表中a链接标签
li_class=soup.select('.categoryem a.vervideo-lilink')

 

 获取需要的详情ID后,要去进行ID拼接才能请求进入详情界面

用浏览器进入详情页面后,打开后端,刷新页面,查看请求信息中的url与请求方式,获取源地址信息

# 循环获取视频地址
for a_href in li_class:
    # 获取网址具体地址
    a_list_href=a_href.get('href')
    # 获取网络ID
    video_id=a_list_href.split('_')[-1]
    # print(video_id)
    # 发送请求
    res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?',
                      # 请求体确定视频
                      params={"contId": video_id},
                      # 请求头输入防爬链
                      headers={"Referer": "https://www.pearvideo.com/video_%s"%video_id},
                      )

 

但是打开url地址后,并没有视频,所以这不是我么们要的视频地址

 

 那真正的视屏地址在哪呢,首先运行视频,打开页面的网络源码后,查找video标签,那才是视频地址

 

 可以发现真实地址与请求的家地址存在相同却又不相似的地方,而假地址的不同数据就是请求数据中获得的systmeTime,所以把家地址中的systemTime中的数据替换成真地址中的数据即可获取事情内容,真地址的不同处为'cont-'加上述首页程序获取的video_id号,便可请求视频数据

    # 因为是json格式,使用json转义对应数据,获取假的视频地址
    fake_href=res2.json()["videoInfo"]["videos"]['srcUrl']
    # print(fake_href)
    # 获取冲突值
    systemtime=res2.json()["systemTime"]
    # 将假地址变成真地址
    real_href=fake_href.replace(systemtime,'cont-%s'%video_id)
    # 发送请求
    res4=requests.get(real_href,
                      # 请求体确定视频
                      params={"contId": video_id},
                      # 请求头输入防爬链
                      headers={"Referer": "https://www.pearvideo.com/video_%s" % video_id},
                      )

 

梨视频官网存在防爬链,所以要在请求头加入该数据

    # 路径拼接
    file_path=os.path.join(r'视频',real_href[-8:])
    # 打开路径,以二进制写入
    with open(file_path,'wb') as f:
        # 写入数据
        f.write(res4.content)
    # 提示成功
    print("亲下载成功")

如果访问过于频繁,网站地址会把电脑IP封掉,所以最好加个访问延迟,减缓工作量避免被防封号 

    # 等待时间
    time.sleep(1)

执行结果

 

 

返回目录

posted @ 2021-09-23 15:45  微纯册  阅读(325)  评论(0编辑  收藏  举报