2017-05-29 93 views
1

我想從網站下載多個壓縮文件。我已經看過下載一個文件的答案,它看起來非常簡單,但是我很難使它適用於多個文件。該網址有超過140個壓縮文件,我想下載。使用python從url下載多個壓縮文件

到目前爲止我的代碼的想法是:

import urllib 
url = "http://ftp.geogratis.gc.ca/pub/nrcan_rncan/vector/geobase_nhn_rhn/shp_en/03/" 
##search url for zipped files and download them (this is where I am stuck) 
urlfile = (the zipped files??) 
if urlfile.endswith (".zip"): 
    urllib.urlretrieve (url, r"C:\Users\maverick\Desktop\Canada Features") 

我知道它甚至還沒有接近我所需要的,但在正確的方向一推,將不勝感激。我也看了Scrapy,但我認爲urlib應該能夠完成任務。

+2

你可以通過[ftp]連接(https://stackoverflow.com/questions/111954/using-pythons-ftplib-to-get-a-directory-listing-portably)來傳輸你的文件嗎?如果你注意解析網頁,那麼[美麗的湯](https://stackoverflow.com/questions/tagged/beautifulsoup?sort=votes&pageSize=15)可能對你有用。 – Eric

回答

1

正如@Eric所說,這個服務器基本上是爲ftp服務器運行一個html替代接口。您可以直接使用ftp接口,如:

from ftplib import FTP 
import os 

FTP_HOST = "ftp.geogratis.gc.ca" 
FTP_DIR = "pub/nrcan_rncan/vector/geobase_nhn_rhn/shp_en/03/" 
OUT_DIR = "/my/documents" # <-- point this to an appropriate location! 

# connect to host 
ftp = FTP(FTP_HOST) 
ftp.login() 

# get list of .zip files 
ftp.cwd(FTP_DIR) 
files = ftp.nlst() 
files = [f for f in files if f.lower().endswith(".zip")] 

# download files 
num = len(files) 
for i, fname in enumerate(files, 1): 
    print("Downloading {} ({}/{}) ... ".format(fname, i, num), end='') 
    local_file = os.path.join(OUT_DIR, fname) 
    with open(local_file, "wb") as outf: 
     ftp.retrbinary("RETR "+fname, outf.write) 
    print("done!") 

ftp.close() 

請注意,這可能需要一段時間;該目錄包含9.3 GB的文件。

+0

謝謝Eric和Hugh。我沒有這樣想過。我對Python非常陌生,主要用於ArcMap ArcMap(非常基本的地理處理)。我會試試這個腳本,看看它是如何發展的。此外,非常感謝腳本中的評論,所以我可以理解發生了什麼。 –

相關問題