2012-10-10 102 views
0

我有以下代碼:Python的網頁抓取暫停

#!/usr/bin/env python 
from mechanize import Browser 
from BeautifulSoup import BeautifulSoup 

mech = Browser() 
mech.set_handle_robots(False) 
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip" 
page = mech.open(url) 
html = page.read() 

soup = BeautifulSoup(html) 
print soup.prettify() 

真正簡單的web刮刀試圖從網頁上下載一個.zip文件。當我運行這個代碼時,記住這個文件是4kb,程序不會完成,就好像它處於無限循環中一樣。我在這裏做了什麼?

+0

你等了多久才完成?我剛剛用'timeit'('python -m timeit -n 1 -r 1 -s「import requests」「r = requests.get('http://storage.googleapis.com/patents/retro/2011/ad20111231 -02.zip')。content「'),它花了113秒。你至少等了多久? – jdotjdot

回答

2

嘗試把print html做完page.read()之後。你可能沒有得到你的想法,這聽起來像是你收到了一個錯誤頁面,而不是文件本身。我不確定你是否正確處理文件,你可能會在這裏找到一個更好的方法:Download all the links(related documents) on a webpage using Python

該zip文件不是4KB,順便說一句,它是〜87MB,幷包含一個784MB XML文件,您應該能夠通過在瀏覽器中點擊該URL並進行下載來進行確認。它可能不是一個無限循環,這是一個問題,只是需要很長時間才能加載。

您還試圖以zip格式存檔XML時以HTML格式傳遞數據。如果(一旦您實際上文件),您將響應數據存儲在StringIO中,您可以將其解壓縮到內存中(as outlined here)。然後你需要explicitly tell BeautifulSoup,你傳遞它的XML。

soup = BeautifulSoup(html, 'xml') 

這需要你install lxml,但將制定出你的優勢,因爲它可能是Python的最快捷的XML解析器。

最後一兩件事:

mech.set_handle_robots(False) 
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip" 

我的印象是谷歌建立了robots.txt不允許刮儘可能下。如果你仍然無法下載該文件的副本,我建議嘗試Selenium;它很像mechanize,但控制着實際的瀏覽器,例如Chrome瀏覽器& Firefox,所以它將是一個合法的瀏覽器請求。

+0

「你也試圖在XML中以HTML格式傳遞數據」 - 他似乎並沒有先解壓縮數據,所以他實際上試圖解析可能沒有幫助的zip文件。 – George

+0

謝謝,我會更新以包括這一點。 –