从javascript生成的链接中下载URL

时间:2017-08-08 16:30:06

标签: python html web-scraping

我知道这篇文章可能会被关闭,但我必须尝试,因为我非常绝望。 我不是在寻找解决方案,而是寻找技术。 我试图从公共网站上抓取一些内容(我在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无关...

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

2 个答案:

答案 0 :(得分:3)

  

我知道浏览器不会发出任何新请求(通过它监控它)   开发人员标签)当我按下此链接时。

浏览器确实提出了新请求;并使用HTTP/1.1 302 FOUND标题回复Location,其中包含您寻找的网址。

Download link response headers

这是一个从此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文件!

答案 1 :(得分:0)

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