正在下载的Python Selenium PhantomJS-Extract文件的下载链接[英] Python Selenium PhantomJS - Extract download link of file that is being downloaded

问题描述

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

我正在开发的网站是 emuparadise.me,我正在下载一个带有此请求的 rom 文件 link 添加 cookie 后避免出现"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")

请注意,我根本不关心文件的下载,我也不知道或不需要知道下载文件的位置.我发现了实际的 link 获取来自 firefox 的特定示例文件,以防您需要它进行测试.对于如此简单的任务,我也更喜欢使用 PhantomJS 而不是 Firefox 或 Chrome 网络驱动程序.任何帮助将不胜感激.

推荐答案

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

本文地址:https://www.itbaoku.cn/post/1740207.html