目标地址:汽车热点资讯短视频_汽车热点新闻-梨视频官网-Pear Video
1.爬取网页内容,第一步肯定要先判断网页数据的加载方式,直接加载或动态加载
因此直接点进网页,右击查看网页源代码
随便看一下,发现网页上的内容该有的都有,也可以ctrl+f搜索几个关键字看看,确定是直接加载的
2.第二步找一下需要的视频部分的代码在哪里,可以右击网页,用检查界面的小鼠标点视频寻找,可以直接在源代码中寻找
然后发现视频相关的代码都是用li列表标签嵌套的,而和视频本身有关的代码也只有里面的a链接代码,因此需要想办法获得a代码中的href字段video_1742296
3.获得链接后,先点进去看看是个什么情况,发现是个深层网页,那要想获得视频的链接就得再来一次,先判断加载方式,发现后台找不到视频相关字段,说明是动态加载
4.右击网页,检查,刷新一下网页,发现网页果然偷偷发了一条get请求
仔细看一下请求的内容和返回的内容
5.发现返回的视频地址和网页使用的视频地址不太一样,推测网页可能使用了防盗链防止我们爬取
(防盗链:校验当前请求从何而来 如果是本网站则允许访问如果是其他网址则拒绝在请求头中有一个专门用于记录从何而来的键值对:referer建)
6.为了破除防盗链,首先我们要完全模仿原网页向视频网址发送请求,及在请求头中加上和原网页一模一样的referer参数,get请求也发送和原网页一样的contid,这个contid,仔细一看,不就是之前获取的href吗?这样的话不出意外就可以直接用%s占位符,写出多个视频通用的contid
7.正常情况下,这样一来就可以获得和原网页一样的返回数据
我们只需要其中的srcUrl字段,所以先从多层字典中挑出srcUrl字段
8.最好一个问题,返回的srcUrl字段和网页使用的视频网址不一样,但是仔细对比一下发现
差的就是中间职责一小段,这样的话只要用replace替换掉中间的一小段就可以得到正确的视频网址,为此需要找到替换字符和被替换字符分别来自哪里
9.这里就需要一点观察能力了,可以发现正确网址的字符就是之前的href内容,而假网址中的奇怪字段来自:
这样一来只要多获取一下systemTime字段,替换一下就完成了
10.最好再根据第一个网页的翻页方式判断一下,原网页只要翻到最底下就会自动加载新的一页,网页源代码中也没有,那就简单了,直接检查一下翻页时的请求,果然有个新网址的get请求,根据网址的附加属性和每页的视频数很容易猜出规律,start后面就是网页显示的视频个数,12个为一页
import requests from bs4 import BeautifulSoup import os import time if not os.path.exists(r'梨视频数据'): os.mkdir(r'梨视频数据') def get_video(n): res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start=%s' % n) soup = BeautifulSoup(res.text, 'lxml') li_list = soup.select('li.categoryem') for li in li_list: a_tag = li.find(name='a') a_href_link = a_tag.get('href') # video_1742158 video_id = a_href_link.split('_')[-1] headers = { "Referer": "https://www.pearvideo.com/video_%s" % video_id } res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp', params={'contId': video_id}, headers=headers ) data_dict = res1.json() src_url = data_dict['videoInfo']['videos']['srcUrl'] systemTime = data_dict['systemTime'] # https://video.pearvideo.com/mp4/adshort/20210920/1632285084621-15771122_adpkg-ad_hd.mp4 real_url = src_url.replace(systemTime, 'cont-%s' % video_id) res2 = requests.get(real_url) file_path = os.path.join(r'梨视频数据', '%s.mp4' % video_id) with open(file_path, 'wb') as f: f.write(res2.content) time.sleep(0.5) for n in range(12, 48, 12): get_video(n)