我一直在尝试在YouTube视频页面上执行获取请求,以便从页面中读取简单信息。我以前做过很多次,通常在谷歌Chrome的开发者工具的帮助下对获取请求进行反向工程很容易。
为了演示,以下是我在开发人员菜单中看到的,在新的隐身窗口中重新加载YouTube视频(以防止发送Cookie)时获得的请求的屏幕截图: chrome screenshot
每次关闭窗口并重新加载页面时,我都会收到几乎相同的HTML(除了授权密钥等),其底部可以看到:another chrome screenshot
首先,我尝试使用Python中的无标题get来重新创建此请求:
import requests
sesh = requests.Session()
print sesh.get("https://www.youtube.com/watch?v=5eA8IVrQWn8").content
这将返回一个不同的页面,该页面仍然包含我从chrome获得的页面上的一些数据,但几乎不是全部。接下来,我尝试使用以下代码包含我在chrome请求中看到的所有标题:
import requests
sesh = requests.Session()
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"accept-encoding": "gzip, deflate, br",
"accept-language":"en-US,en;q=0.8",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"}
print sesh.get("https://www.youtube.com/watch?v=5eA8IVrQWn8", headers = headers).content
然而,这非常奇怪地返回一个看似随机的快速段落的unicode字符,长度不等,有时大约10个字符长,有时接近50个。我无法想到任何其他方法使这更接近请求我从铬看到了。我试着摆弄这个问题几个小时,比如在同一个会话中多次运行请求并稍微搞乱标题,但是无济于事。
最终出于绝望,我尝试使用以下代码删除除用户代理之外的所有内容:
import requests
sesh = requests.Session()
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"}
print sesh.get("https://www.youtube.com/watch?v=5eA8IVrQWn8", headers = headers).content
这让我得到了我想要的页面。
然而,我不知道以某种方式复制我在Chrome中看到的Get并没有起作用。我第二次尝试失踪了什么?