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

Python Selenium PhantomJS-提取正在下载的文件的下载链接,python,python-3.x,selenium,selenium-webdriver,phantomjs,Python,Python 3.x,Selenium,Selenium Webdriver,Phantomjs,因此,正如标题所示,我试图通过Python3.7中的selenium获得使用PhantomJS下载文件的直接链接 我正在工作的站点是emuparadise.me,在添加cookie以避免出现“无效引用”错误后,我正在下载一个rom文件并向其发出请求。当请求发出浏览器时。当前url显示about:blank,我通过检查PhantomJS的网络使用情况知道该文件已开始下载。我已经在网上浏览了3个多小时,现在还没有找到任何方法来检索下载文件的url 我的解决方案之一是创建一个线程,用于跟踪对浏览器的更

因此,正如标题所示,我试图通过Python3.7中的selenium获得使用PhantomJS下载文件的直接链接

我正在工作的站点是emuparadise.me,在添加cookie以避免出现“无效引用”错误后,我正在下载一个rom文件并向其发出请求。当请求发出
浏览器时。当前url
显示
about:blank
,我通过检查PhantomJS的网络使用情况知道该文件已开始下载。我已经在网上浏览了3个多小时,现在还没有找到任何方法来检索下载文件的url

我的解决方案之一是创建一个线程,用于跟踪对
浏览器的更改。当前的url
,但发出请求时,浏览器似乎会锁定

这是我目前的代码:

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中找到了该特定示例文件的实际版本,以备测试时需要。与Firefox或Chrome web驱动程序相比,我更喜欢使用PhantomJS来完成如此简单的任务。任何帮助都将不胜感激。

php页面正在提供该文件。无法在客户端获取路径或实际文件名。(补充:现在我重新阅读了你的问题,我想你确实得到了客户端的链接!…你每天都会学到一些新东西!但是,Selenium在DOM之外没有访问权限。)

所以我终于找到了解决方案。因为我知道下载url必须在我请求的标题中的某个地方,所以我搜索了一种方法来查看PhantomJS。这确实很容易。我所做的只是将日志级别从
INFO
(默认)更改为
DEBUG
,并且头出现在日志文件中的events
页面下。onResourceRequested
页面。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"))

编辑:

事实上,我发现了一种更简单的方法,可以使用
请求
函数更轻松、更优雅地实现完全相同的功能。这是对url的HTTP头的请求,因此是名称,我们仍将传入相同的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"))

唯一的办法就是破解它。。。尝试获取路径或文件名中出现的错误,并推断出其余错误。这不是一件很好的事情,可能被认为是恶意的。他们以这种方式提供文件可能是有原因的。(他们不想让你直接链接到它…)现在我看到Firefox有了路径,你可以用某种Firefox插件将路径写入页面。然后,您可以使用Selenium从DOM中提取它。PhantomJS是否已被弃用?我解释了我为什么要使用它。这是给未来读者的评论,他们想知道为什么你的代码不再有效。很高兴知道您何时使用不推荐的代码,这样您就可以知道它正在等待删除。哦,好吧,我会记住的,谢谢。