Python Selenium PhantomJS - извлечь ссылку на скачивание файла, который загружается - PullRequest
0 голосов
/ 23 мая 2019

Итак, как следует из названия, я пытаюсь получить прямую ссылку для загрузки файла с помощью PhantomJS через селен в Python 3.7

Сайт, над которым я работаю, это emuparadise.me, я загружаю файл rom с запросом на эту ссылку после добавления файла 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")

Обратите внимание, что мне абсолютно все равно, скачивать ли файл, я также не знаю и не должен знать, куда он загружается. Я обнаружил фактическую ссылку для этого конкретного файла примера из Firefox на тот случай, если он понадобится вам для тестирования. Я также действительно предпочитаю использовать PhantomJS поверх веб-драйверов Firefox или Chrome для такой простой задачи. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Итак, я наконец пришел к решению Поскольку я знаю, что 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"))

EDIT:

На самом деле я обнаружил, что намного проще и точнее добиться того же, используя функцию requests 'head. Это делает запрос на HTTP-заголовки URL, отсюда и имя, и мы все равно передадим тот же 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"))
0 голосов
/ 23 мая 2019

Страница php обслуживает файл.Вы не можете получить путь или реальное имя файла на стороне клиента.(Добавлено: теперь, когда я перечитал ваш вопрос, я думаю, вы получили ссылку на стороне клиента! ... вы узнаете что-то новое каждый день! Но у Selenium нет доступа за пределы DOM.)

...