2010-08-28 70 views
0

以下網址(和其他類似的),可以在瀏覽器中打開,導致urllib2.urlopen拋出404異常:http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=1urllib2.urlopen拋出404例外網址的瀏覽器打開

的getURL()返回相同的網址(不重定向)。頭文件被複制並從螢火蟲粘貼。我嘗試將頭文件作爲字典傳遞給Request,但得到了相同的結果。 wget在控制檯中打開url,但不是從腳本中打開。

的代碼:

SOURCE_URL = 'http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2'
嘗試:

socket.setdefaulttimeout(10) 
    hdrs = [('Host','store.ovi.com'),('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US;rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13 AppEngine-Google;(+http://code.google.com/appengine)'),('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),('Accept-Language','en-us,en;q=0.5'),('Accept-Encoding','gzip,deflate'),('Accept-Charset','ISO-8859-1,utf-8;q=0.7,*;q=0.7'),('Keep-Alive','115'),('Connection','keep-alive'),('Cookie','JNPRSESSID=4u4devdrt7eb6e0qem3gin47i2; s_cc=true; undefined_s=First%20Visit; s_nr=1282817443274; s_sq=%5B%5BB%5D%5D; view=Grid; menu=menuOpen; OVI_DEVICE=b5130'),('Cache-Control','max-age=0')] 
ree = urllib2.Request(source_url) 
    ree.addheaders = hdrs 
    opener = urllib2.build_opener() 
    htmlSource = opener.open(ree).read() 

除了urllib2.HTTPError,E:

print e.code 
    print e.msg 
    print e.headers 

誤差輸出:
未找到
日期:星期六,2010年8月28日0點36分57秒GMT
服務器:Apache/2.2.3(紅帽)
X供電-者:PHP/5.2.2
過期:星期四,1981年11月19日08:52:00 GMT
緩存控制:無存儲,無緩存,必須重新驗證,後檢查= 0,預檢查= 0
pragma:no-cache
Keep-Alive:timeout = 7,max = 333
連接:Keep-Alive
傳輸編碼:分塊
Content-Type:text/html; charset = UTF-8

什麼,如果有的話,我做錯了嗎?這是一個錯誤?如果是這樣,是否有解決方法?謝謝!

+0

在URL中的片段似乎搞亂事情 – aaronasterling 2010-08-28 01:15:52

回答

3

考慮像URL:

http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2 

該瀏覽器獲取位就是:

http://store.ovi.com/ 

一切的權利是一個「片段標識符」,這是不傳遞到服務器(顯然,如果你嘗試,它會變得困惑)。相反,爲/網址返回的HTML將包含一段JavaScript代碼,該代碼將在客戶端讀取#...數據,並使用一堆XMLHttpRequest來填充頁面內容。

以這種方式實現的Web應用程序是一個很大的古老痛苦,因爲你不能只取主頁的HTML內容。相反,您必須對腳本進行分析以找出從哪裏獲取實際數據,或者必須連接真實的瀏覽器才能執行所有腳本並查看您留下的文檔對象。他們通常對訪問和搜索引擎優化也不利。

幸運的是,這個網站似乎把東西放在片段中,這也是一個有效的路徑。因此,它看起來像你可以從URL獲取動態頁面數據:

http://store.ovi.com/applications?categoryId=20&fragment=1&page=1 
+0

謝謝回答。 從控制檯使用wget()打開url可以正常工作。爲什麼wget似乎成功傳遞了片段標識符,而urlib2卻沒有? 謝謝。 – smumbai 2010-08-30 02:00:20

+0

'wget'沒有傳遞片段標識符,它在使用它之前將其從URL中切斷。如果'urllib2'沒有,這就是一種錯誤。 – bobince 2010-08-31 00:53:17