爬取流程(美食区最热标签下的三个视频)
- 在首页获取视频的编号和名字
- 拼接成正确的url
- 保存视频
思路
1.从网页中获取视频的url
发现视频的url在id为“jprismplayer”的div标签下的video标签src属性中,xpath解析网页
1
|
video_url = tree.xpath( "//div[@id='JprismPlayer']/video/@src" ) |
但得到的返回值为空,也就是说这个video标签在原网页中并不存在,很可能是动态加载出来的
2. 从动态请求获取视频的url
果然在动态请求中发现了包含视频url的json数据
可是发起请求后拿到的json数据却和抓包工具中看到的不一样,试着在请求头中加入referer参数,查看referer可以发现,它最后video_后面跟的是首页中视频的编号
1
2
3
4
5
6
|
{ "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了
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# 爬取梨视频 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?contId={idNum}' # 得到包含视频地址json响应数据 response = requests.get(url = url, headers = headers).json() video_url = response[ "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爬取梨视频的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/miraak/p/14336184.html