【问题标题】:Python Selenium PhantomJS - Extract download link of file that is being downloadedPython Selenium PhantomJS - 提取正在下载的文件的下载链接
【发布时间】:2019-10-10 09:47:44
【问题描述】:

正如标题所示,我正在尝试通过 Python 3.7 中的 selenium 使用 PhantomJS 获取下载文件的直接链接

我正在处理的网站是 emuparadise.me,我正在下载一个 rom 文件,在添加 cookie 后向 link 发出请求,以避免出现“Invalid Referer”错误。当发出请求时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 网络驱动程序。任何帮助将不胜感激。

【问题讨论】:

  • PhantomJS 已弃用
  • 所以?我解释了我为什么要使用它..
  • 这是对想知道为什么您的代码不再工作的未来读者的评论。很高兴知道您何时使用已弃用的代码,这样您就可以知道它正在等待删除。
  • 哦,那好吧,我会记住的,谢谢。

标签: python python-3.x selenium selenium-webdriver phantomjs


【解决方案1】:

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

【讨论】:

  • 唯一的方法是破解它...尝试让路径或文件名出现错误并推断其余部分。这不是一件好事,而且可能被认为是恶意的。他们以这种方式提供文件可能是有原因的。 (他们不希望您直接链接到它...)
  • 现在我看到 Firefox 有路径,您可以使用某种将路径写入页面的 Firefox 插件来执行此操作。然后,您可以使用 Selenium 从 DOM 中提取它。
【解决方案2】:

所以我终于想出了解决方案。因为我知道下载 url 必须在我的请求标头中的某个位置,所以我搜索了一种方法来查看它们的 PhantomJS。确实,这很容易。我所做的只是将日志级别从INFO(默认)更改为DEBUG,并且标题出现在事件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 标头的请求,因此是名称,我们仍将传递相同的 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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多