2017-05-29 9 views
1

ウェブサイトから複数の圧縮ファイルをダウンロードしようとしています。私は1つのファイルをダウンロードするための答えを見てきましたが、それはかなり簡単ですが、私はそれが複数のファイルのために働くように問題を抱えています。 URLには、私がダウンロードしたい140個の圧縮ファイルがあります。pythonを使用してURLから複数のzipファイルをダウンロードする

は、これまでのところ、私のコードの考えは以下のとおりです。

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代替インターフェイスを実行しています。

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

このような場合は、次のようにftpインターフェイスを直接使用することができます。ディレクトリには9.3 GBのファイルが含まれています。

+0

ありがとう、エリックとヒュー。私はそのように考えなかった。私はPythonにはまったく新しいので、ArcMap(非常に基本的なジオプロセシング)のためにArcpyで主に使用します。私はこのスクリプトを試して、それがどうなるかを見ていきます。また、私は何が起こっているのか理解できるように、スクリプトのコメントを高く評価します。 –

関連する問題