【问题标题】:How to use requests in Python 3 to fetch data from website that utilizes JavaScript and jQuery如何在 Python 3 中使用请求从使用 JavaScript 和 jQuery 的网站获取数据
【发布时间】:2018-02-25 01:21:28
【问题描述】:

我在 Python 3 中使用 requests 库已经有一段时间了,并决定创建一个测试程序。对于这个程序,我以网站https://ytmp3.cc/ 为例。但事实证明,在客户端似乎发生了很多事情。

正在生成一些密钥和其他内容,我一直在使用 Firefox 的内置网络监视器来确定这是在哪些请求中发出的,但没有运气。

据我所知,请求库无法通过发出更多请求来保持“页面”打开并修改 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 链接时,会向 url 发出请求,如下所示。

https://d.ymcdn.cc/check.php?callback=jQuery33107639361236859977_1519520481166&amp;v=eVD9j36Ke94&amp;f=mp3&amp;k=7_1a-a&amp;_=1519520481168

这将返回以下内容:

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&amp;v=eVD9j36Ke941519520481168

创建请求需要哪些内容?

【问题讨论】:

    标签: javascript python web-scraping python-requests client-side


    【解决方案1】:

    只需使用youtube-dl,特别是使用--extract-audio --audio-format mp3 选项,您可能会为自己和该网站的运营商省去很多麻烦。这可能是该网站本身使用的。

    youtube-dl是用Python写的,可以easily be used programatically

    如果您出于某种原因坚持向该网站发送请求,我会这样做:

    • callback=jQuery33107639361236859977_1519520481166 指定 JSONP 请求的回调名称。您提供的任何名称都将被打印出来。例如,传递callback=foo 将导致以下响应:

      foo({...})
      

      您可以完全省略它,在这种情况下服务器将只提供 JSON 响应,这很好。

    • _=1519520481168 只是为了防止响应被缓存。它是随机生成的,就像上面的参数一样。但是,该网站会检查是否存在,因此您至少必须传递一些东西。

    • 与许多网站一样,该网站会检查有效的 Referer 标头。

    这是向该网站发出请求的最小 cURL 命令行:

    curl 'https://d.ymcdn.cc/check.php?v=eVD9j36Ke94&f=mp3&k=aZa4__&_=1' -H 'Referer: https://ytmp3.cc/'
    

    【讨论】:

    • 这么说的回调,是存储响应JSON?给人感觉。但是 ID =15.... 呢?这个 ID 如何防止缓存?而且我还看到在请求 url 中,你使用 &k=aZa4_ 你怎么能继续重用它呢?我认为它是针对每个请求的?
    • @user6827994:JSON 是有效的 JavaScript,但由于安全限制,通常不能跨域使用。 JSONP 是一种将 JSON 包装在函数调用中的技术的名称,以便仅使用 &lt;script&gt; 标记就可以跨域加载它。至于_= 1519520481168,您可以同样轻松地使用oifjpoaisdapsdk=aiosjdoiasjd。唯一重要的是 URL 每次都会更改,因为浏览器总是将其视为新资源。
    • @user6827994:至于k=aZa4__,我不知道它是做什么的。该网站检查的只是它是一个由来自{'a', '_', '-', '7', '1', '4', 'Z'} 的字母组成的六个字符长的字符串。如果您想模仿浏览器并生成与 JavaScript 完全相同的 URL 格式,这并不难。 ` 1519520481168` 只是一个 UNIX 时间戳,您可以使用 int(time.time() * 1000) 生成它。
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多