【问题标题】:Scrape Download Url from a link generated by javascript从 javascript 生成的链接中抓取下载 URL
【发布时间】:2018-01-16 08:01:11
【问题描述】:

我知道这个帖子可能会被关闭,但我必须尝试,因为我非常绝望。 我不是在寻找解决方案,而是在寻找一种技术。 我尝试从公共网站上抓取一些内容(我正在用 python 中的漂亮肥皂做这件事,但这没关系)。 我偶然发现了获取下载链接的问题。 考虑一下:

<a href="/games/9380-beach-buggy-racing/download-filelocal-55787" class="onclick-download-ads app-btn cuprum" title="Скачать apk файл, размером 90.0 MB">
    <b class="btntext">Скачать</b>
    <span class="lcol">90.0 MB</span>
    <span class="rcol">(apk)</span>

</a>

按下此下载链接时,从该地址下载文件 -

http://dl3.top-android.org/?a=eyJkYXRhIjp7ImluZm8iOiJXaW5kb3dzOkNocm9tZXw4OS4xMzguNTQuMjIwIiwiZGF0YSI6eyJpc19hdXRoZW50aWNhdGVkIjpmYWxzZSwiZmlsZW5hbWUiOiJhcHBsaWNhdGlvbnMvYmVhY2gtYnVnZ3ktcmFjaW5nLTEuMi4xMi5hcGsifX19%3A1df1Gg%3AbsYoAragbQaUlQ_hjhJHL3FEliI%3A1df1Gg%3ATE9B8n9tJuMAKwBuzd1hXZmMOaA

如您所见,这不是 a 标签中的 href 地址。 我想以某种方式获得此链接。

  1. 我知道当我点击此链接时浏览器不会发出任何新请求(通过开发人员选项卡对其进行监控)。

  2. 我试图搜索所有的js文件,没有找到与dl3.top相关的...

请帮助我了解发生了什么。 据我了解,如果没有请求,我已经在浏览器中加载了所有相关信息。

【问题讨论】:

  • 可能是 HTTP 重定向?如果您在浏览器上输入 href 地址(使用原始主机名)会发生什么,或者更好的是,在 curl 中?
  • 另外,如果你decodeURIComponent然后base64-decode最新链接的href,你会得到{"data":{"info":"Windows:Chrome|89.138.54.220","data":{"is_authenticated":false,"filename":"applications/beach-buggy-racing-1.2.12.apk"}}} ...不知道是否有帮助!
  • 首先是的,这是一条线索!很酷!但是当我尝试在 python 中对其进行解码时,我得到一个错误:不正确的填充。你有什么idia为什么?你只解码 ?a= 或所有 url 之后的内容?
  • 首先解码为uri组件,然后你会看到它有3个部分由“:”分隔,base64编码的json是第一个直到第一个“:”,其他2个是价值观
  • 我们对这些价值观一无所知?我猜他们是问题的关键

标签: python html web-scraping


【解决方案1】:

我知道浏览器没有发出任何新请求(通过 开发人员选项卡)当我按下此链接时。

浏览器确实发出了一个新请求;它以 HTTP/1.1 302 FOUND 响应,并带有一个包含您查找的 URL 的 Location 标头。

这是一个简单的脚本,用于从该 URL 中抓取 Location 标头。您必须添加 User-AgentReferer 标头才能获得有效响应,否则响应将是 403 Forbidden 错误。

Python 3 代码

import http.client
conn = http.client.HTTPConnection("top-android.org")
conn.debuglevel = 1
conn.request("GET","/games/1556-pou-tamago4i/download-filelocal-32318",headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
    'Referer':'http://top-android.org/games/1556-pou-tamago4i/'
    })
r1 = conn.getresponse()

print("\n\nURL: %s" % r1.getheader('Location'))

它当然会打印想要的链接:

结果

> python scrape_location.py
send: b'GET /games/1556-pou-tamago4i/download-filelocal-32318 HTTP/1.1\r\nHost: top-android.org\r\nAccept-Encoding: identity\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0\r\nReferer: http://top-android.org/games/1556-pou-tamago4i/\r\n\r\n'
reply: 'HTTP/1.1 302 FOUND\r\n'
header: Date header: Content-Type header: Transfer-Encoding header: Connection header: Set-Cookie header: Vary header: Location header: X-Frame-Options header: Server header: CF-RAY

URL: http://dl3.top-android.org/?a=eyJkYXRhIjp7ImluZm8iOiJXaW5kb3dzOkZpcmVmb3h8MmEwMjo1ODc6OWMyNzplNDAwOjg0OGQ6MmNhOmE4Mjk6MjExNyIsImRhdGEiOnsiaXNfYXV0aGVudGljYXRlZCI6ZmFsc2UsImZpbGVuYW1lIjoiYXBwbGljYXRpb25zL3BvdS10YW1hZ280aS0xLjQuNjYuYXBrIn19fQ%3A1dgoCA%3AFsWjvbE-s3Mqe9tZNS2CAbfUinw%3A1dgoCA%3A6rJ8th0GeOHsVtKeAPpnwNfqUa0

请记住,Referer 标头必须设置为 window.location.href,否则将导致 403 错误。

编辑

正如rupps's comment 解释的那样,该 URL 包含 base64 JSON 和二进制数据。在我的例子中,JSON 数据包含 "is_authenticated":false:

{
    "data": {
        "info": "Windows:Firefox|xxxx:xxx:xxxx:xxxx:xxxx:xxx:xxxx:xxxx",
        "data": {
            "is_authenticated": false,
            "filename": "applications/pou-tamago4i-1.4.66.apk"
        }
    }
}

它也下载文件;它有时会因 404 奇怪的错误而失败。如果我坚持点击下载按钮,它会下载 apk 文件!

【讨论】:

  • 哦,看起来很有希望,迫不及待地想回家试试看! :-)
  • 谢谢,但据我所知,例如,由于网址中的加密哈希,我无法更改浏览器并转到此链接,我该如何解密它?
  • @misha312 您可以更改浏览器并通过设置window.location.href = "http://dl3.top-android.org/?a=eyJk..." 强制它下载文件,但在我这边,大多数时候出现404错误,经过一些重试后我能够得到下载以启动。也许这是服务器限制或不经常发生的事情。我建议您尝试一下,并尝试使用window.location.href 使用javascript AJAX 调用该python 脚本进行一些直接下载。
【解决方案2】:

在加载的 JS 库中搜索为 app-btn 定义了 onclick 处理程序的位置。 这将显示添加主机名前缀和“-1.2.12.apk”后缀的处理程序代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多