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自动跟随重定向;你不需要做任何事情。

这里的问题是没有重定向可遵循。网页一加载就使用 Javascript 伪造表单提交。urllib只是获取页面;它没有实现浏览器 DOM 并运行 Javascript 代码。

根据您需要脚本的通用性,最简单的解决方案可能是一些hacky。例如,如果您只是想爬取 500 个结构相似但细节不同的页面,只需找到action第一个页面form并导航到该页面。

此外,如果获取页面和处理它们是两个不同的步骤,您可能需要使用超级简单的 Javascript/Greasemonkey(在浏览器中运行,因此它已经有了一个有效的 DOM 实现等)和一个单独的幻想来编写一个提取器Python 中的处理脚本(仅在最终获取/生成的 HTML 页面上运行)。

如果您需要完全通用,最简单的解决方案可能是使用selenium浏览器自动化框架。(或者,也许是 PyWin32 或 PyObjC 直接自动化 IE 或 Webkit。)

如果你想要最好的解决方案,并且拥有无限的资源……编写你自己的 DOM 实现并连接你最喜欢的 Javascript 解释器(可能是 spidermonkey 或 v8)。这只是编写新浏览器的 2/3 左右。(你可能会找到让你完成 80% 的工作。例如,如果你愿意使用 Jython 而不是 CPython 作为你的 Python 解释器,那就HtmlUnit很巧妙了。)

于 2013-04-23T00:49:14.123 回答