爬取流程(美食区最热标签下的三个视频)
- 在首页获取视频的编号和名字
- 拼接成正确的url
- 保存视频
思路
1.从网页中获取视频的url
发现视频的url在id为“JprismPlayer”的div标签下的video标签src属性中,xpath解析网页
video_url = tree.xpath("//div[@id='JprismPlayer']/video/@src")
但得到的返回值为空,也就是说这个video标签在原网页中并不存在,很可能是动态加载出来的
2. 从动态请求获取视频的url
果然在动态请求中发现了包含视频url的json数据
可是发起请求后拿到的json数据却和抓包工具中看到的不一样,试着在请求头中加入Referer参数,查看referer可以发现,它最后video_后面跟的是首页中视频的编号
{ "resultCode":"1", "resultMsg":"success", "reqId":"fd1c910d-f49a-431a-b9a4-9c193c3c1983", "systemTime": "1611666178518", "videoInfo":{"playSta":"1","video_image":"https://image1.pearvideo.com/cont/20210125/11107897-184717-1.png","videos":{"hdUrl":"","hdflvUrl":"","sdUrl":"","sdflvUrl":"","srcUrl":"https://video.pearvideo.com/mp4/third/20210125/1611666178518-11107897-181816-hd.mp4"}} }
在headers中加入Referer后顺利拿到json数据
可向json数据中的视频url发起请求拿到的却是404页面
3. 拼接正确的url
这里花了很长时间去想哪里有问题,把前面的步骤理了很多遍才发现,其实动态请求返回的json数据中的视频url和主页video标签中的视频url根本不一致
首页中加载出来的视频链接是正确的,可以顺利的拿到视频,而json数据中的链接则会返回404。把他们进行对比,可以看到他们前半部分是一样的,但到了红线框住的地方就不一样了。
正确的url是 cont-视频id-
而json数据中的url这个部分是 一串数字
那只要把这一串数字改成 cont-视频id- 的形式就能获得正确的视频url了
代码
# 爬取梨视频 import requests from lxml import etree import os from multiprocessing import Pool # 梨视频首页url url = "https://www.pearvideo.com/category_6" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36' } # 获取响应,并用etree解析 response = requests.get(url=url, headers=headers).text tree = etree.HTML(response) # 拿到视频的名字和视频号 video_id_list = tree.xpath("//ul[@class='listvideo-list clearfix']/li[@class='categoryem ']//a[@class='vervideo-lilink actplay']/@href") video_name_list = tree.xpath("//ul[@class='listvideo-list clearfix']/li[@class='categoryem ']//a/div[@class='vervideo-title']/text()") data_list = [{"name": video_name_list[i], "idNum": video_id_list[i][6:]} for i in range(len(video_name_list))] # 创建一个存放视频的文件夹 if not os.path.exists("./videos"): os.mkdir("./videos") # 获取视频的函数 def down_video(data): name = data['name'] idNum = data['idNum'] # 获取视频需要的headers,注意这里的Referer要和视频的id匹配 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36', 'Referer': f'https://www.pearvideo.com/video_{idNum}' } # 获取接近真正视频url的url,这里的id也需要和视频id匹配才行 url = f'https://www.pearvideo.com/videoStatus.jsp"videoInfo"]["videos"]["srcUrl"] # 将视频地址中的数字替换成 cont-视频编号 拿到真正的视频地址 video_url = video_url.replace(video_url.split("/")[-1].split("-")[0], "cont-" + idNum) # 拿到视频并保存 video = requests.get(url=video_url, headers=headers).content with open(f"./videos/{name}.mp4", "wb") as f: print(f"正在下载视频 {name} ...") f.write(video) print(f"视频 {name} 下载完成!") if __name__ == '__main__': # 创建进程池并使用 pool = Pool(3) pool.map(down_video, data_list) pool.close() pool.join()
总结
其实最难的地方是获取正确的视频url,中间过程比较绕。只要找到这个地址,再加上从首页拿到的视频id就可以顺利拿到视频了。
如果要爬取整个首页视频只需要重新设置xpath路径就可以了。
以上就是Python爬取梨视频的示例的详细内容,更多关于Python爬取梨视频的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】