2011-08-03 88 views
2

我是Python的新手,我目前的任務是編寫一個網頁爬蟲,在某些網頁中查找PDF文件並下載它們。這是我目前的做法(只爲1個採樣網址):使用mechanize和urllib下載pdf文件

import mechanize 
import urllib 
import sys 

mech = mechanize.Browser() 
mech.set_handle_robots(False) 

url = "http://www.xyz.com" 

try: 
    mech.open(url, timeout = 30.0) 
except HTTPError, e: 
    sys.exit("%d: %s" % (e.code, e.msg)) 

links = mech.links() 

for l in links: 
    #Some are relative links 
    path = str(l.base_url[:-1])+str(l.url) 
    if path.find(".pdf") > 0: 
     urllib.urlretrieve(path) 

程序運行沒有任何錯誤,但我沒有看到任何地方被保存的PDF文件。我可以訪問pdf並通過瀏覽器保存。任何想法發生了什麼?我使用pydev(基於eclipse)作爲我的開發環境,如果這有什麼區別的話。

另一個問題是,如果我想在保存PDF時給出一個特定的名稱,我該怎麼做?這種方法是否正確?在保存PDF之前,我是否必須創建一個帶有「文件名」的文件?

urllib.urlretrieve(path, filename) 

在此先感謝。

回答

3

urllib文檔說此有關urlretrieve功能:

第二個參數,如果存在的話,則指定文件位置複製 到(如果不存在,則位置將是與所生成的名稱的臨時文件)。

函數的返回值有文件的位置:

返回一個元組(文件名,標題)其中filename是本地文件 名下該對象可以發現,和頭是無論返回的urlopen()返回的對象的info()方法是否爲 遠程對象(可能緩存)都爲 。

因此,改變這一行:

urllib.urlretrieve(path) 

這樣:

(filename, headers) = urllib.urlretrieve(path) 

和路徑filename將有位置。或者,將filename參數傳遞給urlretrieve以自己指定位置。

+0

啊,我明白了。謝謝。 – user721975

1

我從來沒有使用機械化,而是來自urllib的文檔在http://docs.python.org/library/urllib.html

urllib.urlretrieve(網址[,文件名[,reporthook [數據]]])

複製如果需要 ,網絡對象用本地文件的URL表示。如果URL指向本地文件,或者該對象的有效緩存副本 存在,則不會複製該對象。返回一個元組 (文件名,頭文件)其中filename是本地文件名,在該文件名下可以找到該對象,並且頭文件是返回的urlopen()返回的對象的info()方法 (對於遠程對象,可能緩存的 )。例外情況與urlopen()相同。

正如你所看到的,如果你沒有指定urlretrieve函數,它會保存到臨時文件中。因此,請嘗試按照第二段代碼中的建議指定文件名。否則,你可以調用urlretrieve這樣的:

saved_filename,headers = urllib.urlretrieve(path) 

再後來就用saved_filename。

+0

+1。感謝您指出。 – user721975