【python】如何爬取XHR状态码302重定向后的location?
本帖最后由 Ishin 于 2021-11-8 15:47 编辑# 目的
---
本来我是想做一个每天自动推送提醒新番更新+新番视频地址的云函数。但是在研究动漫视频网站的时候,一直困于爬取重定向后的地址。
# 爬取网站
网站:https://www.agefans.vip/
以喜欢的 《迦希大人不会气馁~》 <https://www.agefans.vip/play/20210205?playid=2_13> 为例子
## 步骤一
抓包:
> 发现在网站抓包视频API的时候会被反调试,调试会一直自动断下,继续执行会返回主页。Source里面写着 debugger。
解决方法
1. 可以停用断点`deactivate breakpoints`
2. 也可以,在代码行号位置`右键`,添加条件断点`conditional breakpoint`, 写入`false`即可。
3. 又或者,右键代码行,选择`Never pause here`。
## 步骤二
> 研究如何获得视频地址的API。
抓包获取直接可观看的视频地址,例如: https://kol-fans.fp.ps.netease.com/file/61803ebb96dee42611db2b10S4iP7uY403
### 问题是:
如何获取任何番的视频地址。比如,本例中的`61803ebb96dee42611db2b10S4iP7uY403` 这段文件名是如何得到的?
## 步骤三
> 找获得视频文件名的算法API
研究发现,在加载网页过程中,还有另外一个API,用于获取视频的名称。如:<https://play.agefans.vip:8443/_getplay2?kp=......>
#### __然而,更大的问题来了:__
这段更长的参数是哪里来的?
> kp=ZupmAWoVoLSgMfuPPda%2BD%2FxZx11xUjAm4V%2F9Vau9ad1Xrxmvdw5zah1T0YQIXlhLYYbNvyb3IisWvLaAUV8g27R6Zdo9kx%2BYiAJOZrXDtH45SnA4ToISuu2H3a23CczQ4MsoSWO7xUypj6ViUfGXBe%2Ff338dSkTcQTIaAmSiz8P2d0AKU4UH3Q%3D%3D
#### 我完全不知道`kp`参数是如何来的?
## 步骤四
> 跟着网页走它自身获取参数的流程。
1. 点击`Initiator`跟踪网站的发起源。
2. 发现该API是由网页`https://www.agefans.vip/_getplay?aid=20210205&playindex=2&epindex=13&r=0.45431278811630227`发起。
3. 在请求该网站的时候,该网站会自动重定向视频真正地址的`url`(即上图的`location`)给我们。
# 但是
1. 在我使用python模拟操作过程中,明明应该是`302`的`status_code`,却一直返回`200`。
2. 我已经设置了`headers` 和 `cookies`,
3. 还有`allow_redirects=False`。
4. 然而`response.headers` 返回的字典里面也根本没有key为"location"的元素。
5. `response.history`的历史也是为空的列表。
源代码如下:
```python
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
"referer": "https://www.agefans.vip/play/20210327?playid=2_6",
"cookie": "ck_volume=0.45; fa_c=1; Hm_lvt_7fdef555dc32f7d31fadd14999021b7b=1636294078,1636306288,1636309542,1636344668; Hm_lpvt_7fdef555dc32f7d31fadd14999021b7b=1636344998; t1=1636345118306; k1=2409811800; k2=267297131104384; t2=1636345058431; fa_t=1636345058458",
}
url = "https://www.agefans.vip/_getplay?aid=20210327&playindex=2&epindex=6&r=0.5524324470363888"
r = session.get(url,headers=headers,stream=True,allow_redirects=False)
print(r.status_code)
print(r.headers)
```
## 求助
1. 重定向后网址,如https://play.agefans.vip:8443/_getplay2?kp=ZupmAWoVoLSgMfuPPda%2BD%2FxZx11xUjAm4V%2F9Vau9ad1Xrxmvdw5zah1T0YQIXlhLYYbNvyb3IisWvLaAUV8g27R6Zdo9kx%2BYiAJOZrXDtH45SnA4ToISuu2H3a23CczQ4MsoSWO7xUypj6ViUfGXBe%2Ff338dSkTcQTIaAmSiz8P2d0AKU4UH3Q%3D%3D 里面的`kp`参数是如何得到的?
2. 为什么requiests访问本应该重定向302的XHR,却返回`status_code 200`。
3. 为什么会没有.headers["location"]。。
4. 任何形式的帮助,我都感激不尽,因为我已经思考了整整两天,搜索了各种资料,还是不知道为何。谢谢各位。 你请求时的cookie已经过期了所以返回的时200,当然就不存在location了。 很简单啊。 细水流长 发表于 2021-11-8 17:26
简单看了下…………
这个网站跳转到 https://web.age-spa.com:8443/#/play/20200121/2/2 去播放,然后 htt ...
秀啊大佬,api接口怎么搞出来的? 我叫小月亮 发表于 2021-11-8 17:52
秀啊大佬,api接口怎么搞出来的?
没看到人家抓取的嘛 Liyouchen 发表于 2021-11-8 18:20
没看到人家抓取的嘛
秀的一批啊 哈哈哈哈哈 看大佬们探讨技术就是过瘾,贼牛皮的大佬们,留下没有技术的眼泪:'(weeqw 细水流长 发表于 2021-11-8 17:26
简单看了下…………
这个网站跳转到 https://web.age-spa.com:8443/#/play/20200121/2/2 去播放,然后 htt ...
你是如何知道跳转到https://web.age-spa.com:8443/#/play/20200121/2/2 的?我在Chrome里抓包,根本没有发现有这个网站的包?求赐教。谢谢!!!
页:
[1]
2