Python Selenium PhantomJS - 提取下载 link 正在下载的文件

Python Selenium PhantomJS - Extract download link of file that is being downloaded

所以正如标题所暗示的那样,我试图在 Python 3.7

中通过 selenium 使用 PhantomJS 获取下载文件的直接 link

我正在使用的站点是 emuparadise.me,在添加 cookie 以避免出现 "Invalid Referer" 错误后,我正在下载一个带有对此 link 的请求的 rom 文件。当发出请求时 browser.current_url 显示 about:blank 并且我知道文件已经通过检查 PhantomJS 的网络使用情况开始下载。现在已经浏览了 3 个多小时的互联网,我还没有找到任何方法来检索下载文件的 url。

我的一个解决方案想法是创建一个线程来跟踪对 browser.current_url 的更改,但似乎 browser 在发出请求时被锁定

这是我当前的代码:

from selenium import webdriver


browser = webdriver.PhantomJS()
browser.add_cookie({'name': 'refexception', 'value': 1, 'domain': '.emuparadise.me', 'path': '/'})
browser.get("https://www.emuparadise.me/roms/get-download.php?gid=154652&test=true")

请注意,我根本不关心文件的下载,我也不知道也不需要知道文件的下载位置。我已经从 firefox 中发现了该特定示例文件的实际 link,以备您需要它进行测试时使用。我也真的更喜欢使用 PhantomJS 而不是 Firefox 或 Chrome 网络驱动程序来完成如此简单的任务。任何帮助将不胜感激。

php 页面正在提供文件。您无法在客户端获取路径或真实文件名。 (补充:现在我 re-read 你的问题我猜你确实得到了 link 客户端!...你每天都学到新东西!但是,Selenium 没有 DOM 之外的访问权限.)

所以我终于想到了解决方案。因为我知道下载 url 必须在我请求的 headers 中的某个地方,所以我搜索了一种方法来查看它们的 PhantomJS。这确实很容易。我所做的只是将日志级别从 INFO(默认)更改为 DEBUG,并且 headers 出现在事件 page.onResourceRequestedpage.onResourceReceived 下的日志文件中。发出请求后,我只是解析日志文件以查找后一个事件并抓取 url。完整代码如下:

from selenium import webdriver
from json import loads


def get_direct_url_for_game(url):
    browser = webdriver.PhantomJS(service_args=["--webdriver-loglevel=DEBUG"])
    browser.add_cookie({'name': 'refexception', 'value': 1, 'domain': '.emuparadise.me', 'path': '/'})
    browser.get(download_url)

    direct_download_url = None
    with open('ghostdriver.log') as logs:
        for line in logs:
            _, _, event, event_data = line.split(" - ")
            if event == "page.onResourceReceived":
                event_data = loads(event_data)
                if event_data['contentType'] == "application/octet-stream":
                    direct_download_url = event_data['url']
                    browser.quit()
    return direct_download_url


print(get_url_for_game("https://www.emuparadise.me/roms/get-download.php?gid=154652&test=true"))

编辑:

我实际上发现了一种更简单的方法,可以使用 requests' head 函数更轻松、更优雅地实现完全相同的事情。这是对 url 的 HTTP Headers 的请求,因此得名,我们仍将传递相同的 cookie。我们将允许重定向,因为那是我们想要的,url 将在请求的变量 url 下。

看一下:

from requests import head


def get_direct_url_for_game(url):
    request = head(game_url, allow_redirects=True, cookies={'refexception': '1'})
    return request.url


print(get_direct_url_for_game("https://www.emuparadise.me/roms/get-download.php?gid=154652&test=true"))