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.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 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"))
所以正如标题所暗示的那样,我试图在 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.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 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"))