如何使用 Python 3 中的请求从使用 JavaScript 和 jQuery 的网站获取数据
How to use requests in Python 3 to fetch data from website that utilizes JavaScript and jQuery
我已经研究 Python 3 中的请求库很长一段时间了,并决定创建一个测试程序。对于此程序,我使用网站 https://ytmp3.cc/ 作为示例。但事实证明,在客户端似乎发生了很多事情。
正在生成一些密钥和其他内容,我一直在使用 Firefox 的内置网络监视器来确定这是在哪些请求中发出的,但没有成功。
据我所知,请求库无法通过发出更多请求来保持 "page" 打开并修改 DOM 和内容。
任何可以看一下特殊密钥是如何生成的,以及我如何根据自己的要求获得这些密钥的合格猜测的人。
Fx加载网页时,第一个请求是根目录,响应包含网页HTML。我注意到在底部,有一个 url 包含一些键和数字。
<script id="cs" src="js/converter-1.0.js?o=7_1a-a&=_1519520467"></script>
id 7_1a-a
number _1519520467`
这个是用来做下一个请求的,但是后面很多请求都在做,还有一些其他的键也在做。但是我找不到它们的来源,因为它们不是由请求返回的。
我知道在插入 Youtube link 时,会向 url 发出请求,如下所示。
https://d.ymcdn.cc/check.php?callback=jQuery33107639361236859977_1519520481166&v=eVD9j36Ke94&f=mp3&k=7_1a-a&_=1519520481168
这个returns下面的:
jQuery33107639361236859977_1519520481166({"sid":"21","hash":"2a6b2475b059101480f7f16f2dde67ac","title":"M\u00d8 - Kamikaze (Official Video)","ce":1,"error":""})
由此我可以构建下载 url,使用上面的散列:
https://yyd.ymcdn.cc/ + 2a6b2475b059101480f7f16f2dde67ac (hash) + /eVD9j36Ke94
(youtube 视频 ID)
但是我怎么得到
jQuery33107639361236859977_1519520481166&v=eVD9j36Ke94
和 1519520481168
我需要创建哪个请求?
仅使用 youtube-dl
,特别是使用 --extract-audio --audio-format mp3
选项,您可能可以为自己和该网站的运营商省去很多麻烦。这可能是该网站本身使用的。
youtube-dl
写在Python里面可以easily be used programatically.
如果您出于任何原因坚持向该网站发送请求,我会这样做:
callback=jQuery33107639361236859977_1519520481166
指定 JSONP 请求的回调名称。您提供的任何名称都将被打印出来。例如,传递 callback=foo
将导致以下响应:
foo({...})
您可以完全忽略它,在这种情况下服务器将只提供一个 JSON 响应,这很好。
_=1519520481168
只是为了防止响应被缓存。它是随机生成的,就像上面的参数一样。但是,该网站会检查是否存在,因此您至少必须传递一些内容。
与许多网站一样,该网站会检查有效的 Referer
header。
这是向该网站发出请求的最小 cURL 命令行:
curl 'https://d.ymcdn.cc/check.php?v=eVD9j36Ke94&f=mp3&k=aZa4__&_=1' -H 'Referer: https://ytmp3.cc/'
我已经研究 Python 3 中的请求库很长一段时间了,并决定创建一个测试程序。对于此程序,我使用网站 https://ytmp3.cc/ 作为示例。但事实证明,在客户端似乎发生了很多事情。
正在生成一些密钥和其他内容,我一直在使用 Firefox 的内置网络监视器来确定这是在哪些请求中发出的,但没有成功。
据我所知,请求库无法通过发出更多请求来保持 "page" 打开并修改 DOM 和内容。
任何可以看一下特殊密钥是如何生成的,以及我如何根据自己的要求获得这些密钥的合格猜测的人。
Fx加载网页时,第一个请求是根目录,响应包含网页HTML。我注意到在底部,有一个 url 包含一些键和数字。
<script id="cs" src="js/converter-1.0.js?o=7_1a-a&=_1519520467"></script>
id 7_1a-a
number _1519520467`
这个是用来做下一个请求的,但是后面很多请求都在做,还有一些其他的键也在做。但是我找不到它们的来源,因为它们不是由请求返回的。
我知道在插入 Youtube link 时,会向 url 发出请求,如下所示。
https://d.ymcdn.cc/check.php?callback=jQuery33107639361236859977_1519520481166&v=eVD9j36Ke94&f=mp3&k=7_1a-a&_=1519520481168
这个returns下面的:
jQuery33107639361236859977_1519520481166({"sid":"21","hash":"2a6b2475b059101480f7f16f2dde67ac","title":"M\u00d8 - Kamikaze (Official Video)","ce":1,"error":""})
由此我可以构建下载 url,使用上面的散列:
https://yyd.ymcdn.cc/ + 2a6b2475b059101480f7f16f2dde67ac (hash) + /eVD9j36Ke94
(youtube 视频 ID)
但是我怎么得到
jQuery33107639361236859977_1519520481166&v=eVD9j36Ke94
和 1519520481168
我需要创建哪个请求?
仅使用 youtube-dl
,特别是使用 --extract-audio --audio-format mp3
选项,您可能可以为自己和该网站的运营商省去很多麻烦。这可能是该网站本身使用的。
youtube-dl
写在Python里面可以easily be used programatically.
如果您出于任何原因坚持向该网站发送请求,我会这样做:
callback=jQuery33107639361236859977_1519520481166
指定 JSONP 请求的回调名称。您提供的任何名称都将被打印出来。例如,传递callback=foo
将导致以下响应:foo({...})
您可以完全忽略它,在这种情况下服务器将只提供一个 JSON 响应,这很好。
_=1519520481168
只是为了防止响应被缓存。它是随机生成的,就像上面的参数一样。但是,该网站会检查是否存在,因此您至少必须传递一些内容。与许多网站一样,该网站会检查有效的
Referer
header。
这是向该网站发出请求的最小 cURL 命令行:
curl 'https://d.ymcdn.cc/check.php?v=eVD9j36Ke94&f=mp3&k=aZa4__&_=1' -H 'Referer: https://ytmp3.cc/'