1

次のようなページにアクセスするスクリプトを 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>
4

1 に答える 1

4

urllib.request自動的にリダイレクトに従います。何もする必要はありません。

ここでの問題は、従うべきリダイレクトがないことです。Web ページは、JavaScript を使用して、読み込まれるとすぐにフォームの送信を偽装します。urllibページを取得するだけです。ブラウザー DOM を実装せず、Javascript コードを実行しません。

スクリプトをどの程度一般化する必要があるかにもよりますが、最も単純な解決策はハックなものかもしれません。たとえば、構造は似ているが詳細が異なる 500 ページをスパイダーしようとしている場合はaction、最初のを見つけformてそこに移動します。

また、ページのフェッチとそれらの処理が 2 つの別個のステップである場合は、非常に単純な Javascript/Greasemonkey (ブラウザーで実行されるため、既に動作する DOM 実装などがある) と別のファンシーを使用してフェッチャーを作成することをお勧めします。 Python でスクリプトを処理します (最終的に取得/生成された HTML ページで動作するだけです)。

完全に一般化する必要がある場合、最も簡単な解決策は、おそらくseleniumブラウザー自動化フレームワークを使用することです。(または、PyWin32 または PyObjC を使用して IE または Webkit を直接自動化することもできます。)

可能な限り最高のソリューションが必要で、リソースが無限にある場合は、DOM の独自の実装を作成し、お気に入りの Javascript インタープリター (おそらく Spidermonkey または v8) を接続します。これは、新しいブラウザーを作成する場合の約 2/3 の作業にすぎません。(そして、そこまでの 80% を達成できる部分を見つけることができるかもしれません。たとえば、Python インタープリターとして CPython の代わりに Jython を使用したい場合は、HtmlUnit非常に巧妙です。)

于 2013-04-23T00:49:14.123 に答える