如何使用 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=eVD9j36Ke941519520481168

我需要创建哪个请求?

仅使用 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/'