我知道这篇文章可能会被关闭,但我必须尝试,因为我非常绝望。 我不是在寻找解决方案,而是寻找技术。 我试图从公共网站上抓取一些内容(我在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地址。 我想知道这个链接。
我知道当我按下此链接时,浏览器不会发出任何新请求(通过开发人员选项卡进行监控)。
我试图搜索所有js文件,发现与dl3.top无关...
请帮助我了解发生了什么。 据我所知,如果没有请求,我已经在浏览器中加载了所有相关信息。
答案 0 :(得分:3)
我知道浏览器不会发出任何新请求(通过它监控它) 开发人员标签)当我按下此链接时。
浏览器确实提出了新请求;并使用HTTP/1.1 302 FOUND
标题回复Location
,其中包含您寻找的网址。
这是一个从此URL中抓取Location
标头的简单脚本。您必须添加User-Agent
和Referer
标头才能获得有效的响应,否则响应将是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”后缀的处理程序代码。