如何使用urllib进行重定向?

时间:2013-04-22 22:21:04

标签: python redirect python-3.x urllib2 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 个答案:

答案 0 :(得分:3)

urllib.request自动跟踪重定向;你不需要做任何事情。

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

根据您需要脚本的一般程度,最简单的解决方案可能是hacky。例如,如果您只是尝试抓取500个页面,这些页面都具有相似的结构但不同的详细信息,请找到第一个action的{​​{1}}并导航到该页面。

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

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

如果你想要最好的解决方案,并拥有无限的资源......编写你自己的DOM实现并连接你最喜欢的Javascript解释器(可能是spidermonkey或v8)。这只是编写新浏览器的2/3左右。 (并且你可能能够找到能够让你获得80%路径的部分。例如,如果你愿意使用Jython而不是CPython作为你的Python解释器,HtmlUnit非常光滑。)