1.判断网页是否为动态
2.寻找动态数据的来源
3.对比数据
4.解析数据
5.保存数据
6.完整代码展示
1.判断是否为动态网页
单击鼠标右键查看网页源代码,然后在原网页任意复制一个标题,在相应的网页源代码查看是否能够找到匹配项,若无匹配项则说明该网页是动态实时更新的,否则为静态网页
2.寻找数据来源
若为动态网页则在开发者工具里面寻找到XHR,该项动态网页的数据来源。在该项里面找到数据来源的url后,模拟计算机向该网页发送请求。
响应为200,说明请求数据成功。
3.对比数据
因为我们需要爬取多个视频,所以要先对比每页数据的不同之处,如下图,这个和之前爬取图片的网页不太一样,这个多页数据是在同一个url下面,所以我们在XHR数据报里面寻找多页数据的不同。为了避免偶然性,我刷新了三个数据包,对比三个数据包的不同,很容易发现它的pageno好像就是页数,从0顺序加一。
然后请求三页pageNo的数据,请求均成功,说明我们已经成功获取到数据
4.解析数据
首先把数据转换成json格式,json格式和python里面的字典形式很相似,为了方便提取数据,所以我们把数据转换成json格式的格式。
这里将data数据提取出来,循环打印出我们在data字段里面需要得数据,即视频的url地址和name。
事实上,在这里犯了一个错误,我们打印出来的三页数据是一样的,这是因为我们请求的都是一个动态网页的数据,实际上我们应该请求的三个动态网而言数据。所以应该将最开始的url简化后也要放进循环里面,如下图所示。
再次打印视频数据的url和name,这次会发现是三页不同的数据。
然后用将视频数据变成能够写进代码中的二进制数据。
video_data = requests.get(url=video_url, headers=headers).content
5.保存数据*
使用os模块创建文件夹(这一段应该放在循环外面,不然会循环执行这一步,增加代码的时间复杂度),最后打开文件夹保存视频。
import os
if not os.path.exists('视频'):
os.makedirs('视频')
with open('酷六视频\\' + video_title, mode='wb') as f:
f.write(video_data)
print('下载完成:', video_title)
6.完整代码展示
import requests
import json
import os
if not os.path.exists('酷六视频'):
os.makedirs('酷六视频')
'https://www.ku6.com/video/feed'
url = 'https://www.ku6.com/video/feed?'
headers= {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
for page in range(0, 3):
print("=====================正在保存第{}页数据===================".format(page+1))
params = {
'pageNo': str({}).format(page),
'pageSize': '40',
'subjectId': '76'
}
response = requests.get(headers=headers, params=params, url=url)
# print(response.url)
# print(response)
json_data = response.json()
# print(json_data)
data_list = json_data['data']
for data in data_list:
video_title = data['title'] + '.mp4' # 视频的文件名
video_url = data['playUrl'] # 视频的url地址
print(video_title, video_url)
video_data = requests.get(url=video_url, headers=headers).content
with open('酷六视频\\' + video_title, mode='wb') as f:
f.write(video_data)
print('下载完成:', video_title)