7、对动态网页好看视频进行爬虫,利用json模块解析数据,爬取多页视频
7.1 爬虫的一般思路
- 分析目标网页,确定爬取的url路径,headers参数
- 发送请求 --requests 模拟浏览器发送请求,获取响应数据
- 解析数据 --json模块,把json字符串转化为python可交互的数据类型
- 保存数据 --保存在目标文件夹中
7.2 好看视频下载分析
- 判断网页是静态还是动态?
- 如何下载单个网页中的视频?
- 如何下载多个网页中的视频?
7.3 源代码
import requests
import json # json是内置模块,不需要进行pip install
7.3.1 判断网页是静态还是动态?
利用ctrl+u 或者 右击,查看网页源代码,在源代码中检索ctrl+f 网页中信息,如检索到,则为静态网页,如检索不到,则为动态网页。
所以:好看视频是动态网页

7.3.2 获取动态网页的动态数据包


7.3.3 伪造请求头及获取动态数据包url

# 动态数据包的实际地址url
base_url='https://haokan.baidu.com/videoui/api/videorec?tab=gaoxiao&act=pcFeed&pd=pc&num=20&shuaxin_id=1595137580836'
'''
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
浏览器的标识/版本(window操作系统的参数)谷歌浏览器的版本及内核
'''
headers={'user_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4',
'cookie':'BIDUPSID=38A1339AB9DB3E403533B6DAC9A25100; PSTM=1593503342; BAIDUID=38A1339AB9DB3E4080915F2EFABD3F20:FG=1; BDUSS=MyUWtMQldqVmNRYW8tS00xbktLZXlKVlMzV1p0bGpwdTVaQ1lITzdIOW5VeXBmRVFBQUFBJCQAAAAAAAAAAAEAAAAhNQJW0rvR-bfot-jxsvGyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfGAl9nxgJffl; hkpcvideolandquery=%u4F0A%u80FD%u9759%u5D29%u6E83%u5927%u54ED%uFF0C%u59D0%u59D0%u4EEC%u5404%u79CD%u5FAE%u8868%u60C5%u5F15%u70ED%u8BAE%uFF0C%u552F%u6709%u949F%u4E3D%u7F07%u4E3E%u52A8%u611F%u4EBA; BDRCVFR[mkUqnUt8juD]=mk3SLVN4HKm; BDRCVFR[8gzLr2xelNt]=IdAnGome-nsnWnYPi4WUvY; delPer=0; PSINO=1; H_PS_PSSID=1458_31253_32046_32230_32116_26350_32261; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BCLID=10710859748477330018; BDSFRCVID=lTkOJexroG3_5qRrLcVOulPXA3qMFyTTDYLEJs2qYShnrsPVJeC6EG0PtoWQkz--EHtdogKK0gOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tR333R7oKRu_HRjYbb__-P4DeUvnaMRZ56bHWh0bXK5aV4os-pjc5tArW-LebxrlMGnnKUT13lc5h4jX0P7_KRtr346-35543bRTLn76LRv0Kj6HybOfhP-UyN3MWh37Je3lMKoaMp78jR093JO4y4Ldj4oxJpOJ5JbMopCafJOKHIClDT_53e; PC_TAB_LOG=haokan_website_page; Hm_lvt_4aadd610dfd2f5972f1efee2653a2bc5=1594459245,1594465977,1594951275,1595137250; Hm_lpvt_4aadd610dfd2f5972f1efee2653a2bc5=1595137318; reptileData=%7B%22data%22%3A%2220fd0bc3e44db424b83dd1ba0795e50c75a5055be4203fb780de85cba0ed36444244724521177586219277f40728d4f0f1751d57d2a3af3cd38115bcb6202b108ee5c6a9b3d3b5d682b997cbc1ff71c3ed409510ce31e6a34ecc5098f310dd93274bb92d43fc8d1e6bfc7d846e9740988c68c5e555fffef88fff8cf7bdc98a79%22%2C%22key_id%22%3A%2230%22%2C%22sign%22%3A%2285b0c241%22%7D'}
7.3.4 下载单个网页的视频

def one_page_load(base_url,headers):
# 1.获取响应对象
response=requests.get(base_url,headers=headers)
'''
取出响应对象的数据,即文本数据的字符串
'''
data=response.text
# 2.数据转换
'''
data不能与python进行交互,需要把json字符串转化为python可交互的数据类型
json.loads()
'''
json_data=json.loads(data)
# 3.数据解析
data_list=json_data['data']['response']['videos']
# 4.遍历每个视频数据
for data0 in data_list: # 利用键_值对的方法进行提取
video_title=data0['title'] +'.mp4'# 视频的文件名+视频的后缀
video_url=data0['play_url'] # 视频的url地址
# 5.保存数据
print('正在下载:',video_title)
'''
二进制数据通过.content获得response响应对象的数据,
二进制的有:图片、音频、视频
'''
video_data = requests.get(video_url,headers=headers).content# 视频数据是二进制的
with open('.\\video\\'+ video_title,'wb') as f:
f.write(video_data)
print('下载完成')
7.3.5 下载多个网页的视频
相同的url地址发生请求,但是返回的数据发生变化。大数据推荐系统


for page in range(2):
print('======================正在获取第{}页数据==============='.format(page+1))
one_page_load(base_url,headers)
|