Как выполнить редирект с помощью urllib?

Я создаю скрипт в Python 3, который обращается к странице, например:

example.com/daora/zz.asp?x=qqrzzt

используя urllib.request.urlopen("example.com/daora/zz.asp?x=qqrzzt"), но этот код просто дает мне ту же страницу (example.com/daora/zz.asp?x=qqrzzt) и в браузере я получаю перенаправление на страницу вроде:

example.com/egg.aspx

Что я могу сделать, чтобы получить

example.com/egg.aspx

а не

example.com/daora/zz.asp?x=qqrzzt

Я думаю, что это соответствующий код, это код из "example.com/daora/zz.asp?x=qqrzzt":

<head>

<script language="JavaScript">

<!--
    function Submit()

    {
        document.formzz.submit();
    }
-->
</script>

</head>

<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="javascript:Submit();">

<form name="formZZ" method="post" action="http://example.com/egg.aspx">

<input type="hidden" name="token" value="UFASGFJKASGDJFGAJS">

</form>

Заранее спасибо!

1 ответ

Решение

urllib.request автоматически выполняет перенаправления; вам не нужно ничего делать.

Проблема в том, что перенаправления нет. Веб-страница использует Javascript для фальсификации отправки формы, как только она загружена. urllib просто выбирает страницу; он не реализует DOM браузера и не запускает код Javascript.

В зависимости от того, насколько общим должен быть ваш сценарий, самое простое решение может быть чем-то хакерским. Например, если вы просто пытаетесь разбить на 500 страниц, которые имеют похожую структуру, но разные детали, просто найдите action из первых form и перейдите к этому.

Кроме того, если выборка страниц и их обработка - это два разных шага, вы можете написать сборщик с очень простым Javascript/Greasemonkey (запущенным в браузере, поэтому у него уже есть работающая реализация DOM и т. Д.) И отдельной фантазией. скрипт обработки в Python (который работает только с окончательно извлеченными / сгенерированными HTML-страницами).

Если вам нужно быть полностью общим, самое простое решение, вероятно, заключается в использовании selenium рамки автоматизации браузера. (Или, может быть, PyWin32 или PyObjC для автоматизации IE или Webkit напрямую.)

Если вы хотите наилучшее из возможных решений и обладаете бесконечными ресурсами… напишите свою собственную реализацию DOM и подключите ваш любимый интерпретатор Javascript (возможно, spidermonkey или v8). Это примерно на 2/3 больше работы, чем написание нового браузера. (И вы можете найти фрагменты, которые помогут вам на 80%. Например, если вы хотите использовать Jython вместо CPython в качестве интерпретатора Python, HtmlUnit довольно гладко.)

Другие вопросы по тегам