【问题标题】:Downloading multiple zipped files from url using python使用python从url下载多个压缩文件
【发布时间】:2023-03-28 08:24:01
【问题描述】:

我正在尝试从网站下载多个压缩文件。我查看了下载一个文件的答案,看起来很简单,但我无法让它适用于多个文件。该网址有超过 140 个我想下载的压缩文件。

到目前为止,我的代码想法是:

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,但我认为urllib应该能够完成任务。

【问题讨论】:

  • 您可以通过ftp 连接以传输您的文件吗?如果您专注于解析网页,那么Beautiful Soup 可能对您有用。

标签: python url download


【解决方案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 的文件。

【讨论】:

  • 谢谢埃里克和休。我没有那样想。我对 Python 很陌生,我主要在 Arcpy 中将它用于 ArcMap(非常基本的地理处理)。我会试试这个脚本,看看效果如何。另外,非常感谢脚本中的 cmets,以便我了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多