2013-04-22 26 views
1

我創建在Python 3一個腳本,訪問一個頁面,如:使用urllib.request.urlopen如何使用urllib重定向?

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

( 「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=qqrz zt「:

<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> 

在此先感謝!

+0

首先,爲什麼這是標記'urllib2'和'python-3.x'嗎? 3.x中沒有'urllib2',所以......這兩個中哪一個錯了? – abarnert 2013-04-23 00:28:20

回答

2

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

這裏的問題是沒有重定向。該網頁在加載時使用Javascript僞造表單提交。 urllib只是提取頁面;它不會實現瀏覽器DOM並運行Javascript代碼。

取決於你需要腳本的普遍程度,最簡單的解決方案可能是一件好事。例如,如果您只是試圖抓取所有結構相似但具有不同細節的500個頁面,只需找到第一個formaction並導航至該頁面即可。另外,如果抓取頁面並處理它們是兩個截然不同的步驟,那麼您可能希望使用超級簡單的Javascript/Greasemonkey(在瀏覽器中運行,因此它已經有了一個可用的DOM實現等)編寫一個抓取器。還有一個Python獨立的花哨處理腳本(它只是在最終獲取/生成的HTML頁面上運行)。

如果您需要完全一般,最簡單的解決方案可能是使用selenium瀏覽器自動化框架。 (或者PyWin32或PyObjC可以直接自動化IE或Webkit)

如果你想要最好的解決方案,並有無限的資源......編寫你自己的DOM實現並掛接你最喜歡的Javascript解釋器(可能是spidermonkey或v8)。與編寫新瀏覽器相比,這僅僅只有2/3的工作量。 (你也許能夠找到能讓你獲得80%分數的棋子,例如,如果你願意使用Jython而不是CPython作爲你的Python解釋器,那麼HtmlUnit非常光滑。)