【问题标题】:How to download ftp urls that meet certain conditions?如何下载满足一定条件的ftp url?
【发布时间】:2016-07-19 10:34:18
【问题描述】:

我有一个 ftp 链接,其中包含一些我有兴趣下载的文件的链接:

ftp://lidar.wustl.edu/Phelps_Rolla/

我可以使用以下方式列出所有网址:

import urllib2
import BeautifulSoup

request = urllib2.Request("ftp://lidar.wustl.edu/Phelps_Rolla/")
response = urllib2.urlopen(request)
soup = BeautifulSoup.BeautifulSoup(response)

>>> soup
drwxrwxrwx   1 user     group           0 Nov  7  2012 .
drwxrwxrwx   1 user     group           0 Nov  7  2012 ..
drwxrwxrwx   1 user     group           0 Nov  7  2012 ESRI_Grids
drwxrwxrwx   1 user     group           0 Nov  7  2012 ESRI_Shapefiles
drwxrwxrwx   1 user     group           0 Nov  7  2012 LAS_Files
-rw-rw-rw-   1 user     group      545700 May 27  2011 LiDAR Accuracy Report_Rolla.pdf
drwxrwxrwx   1 user     group           0 Nov  7  2012 Rolla Survey
-rw-rw-rw-   1 user     group        4865 May 26  2011 Rolla_SEMA_Tile_Index.dbf
-rw-rw-rw-   1 user     group         503 May 26  2011 Rolla_SEMA_Tile_Index.prj
-rw-rw-rw-   1 user     group         188 May 26  2011 Rolla_SEMA_Tile_Index.sbn
-rw-rw-rw-   1 user     group         124 May 26  2011 Rolla_SEMA_Tile_Index.sbx
-rw-rw-rw-   1 user     group        1100 May 26  2011 Rolla_SEMA_Tile_Index.shp
-rw-rw-rw-   1 user     group       12682 May 31  2011 Rolla_SEMA_Tile_Index.shp.xml
-rw-rw-rw-   1 user     group         140 May 26  2011 Rolla_SEMA_Tile_Index.shx

如何仅下载包含“Tile”或“tile”且扩展名为“.dbf”、“.prj”、“.shp”和“.shx”的链接?

【问题讨论】:

    标签: python download ftp web-scraping beautifulsoup


    【解决方案1】:

    您正在使用 urllib abd 美丽的汤,但在处理 FTP 专用标准库模块时ftplib 可能是更好的选择。前往文档并阅读如何连接到 FTP 并打开连接和列表目录,那里有简单的步行槽。

    下一步是弄清楚如何过滤你的文件,这是一些列表理解过滤字符串到那些里面有一些字符串的问题,例如见this questionthis question。最后你需要谷歌如何通过FTP下载文件,你will find this question。事实证明,文件下载是通过调用ftp.retrbinary() 进行的。

    这是一个简单的脚本,可以完成我上面提到的所有事情:

    from ftplib import FTP
    
    ftp = FTP("lidar.wustl.edu")
    ftp.login()
    ftp.cwd("Phelps_Rolla")
    # list files with ftplib
    file_list = ftp.nlst()
    
    for f in file_list:
        # apply your filters
        if "tile" in f.lower() and any(f.endswith(ext) for ext in ['dbf', 'prj', 'shp', 'shx']):
            # download file sending "RETR <name of file>" command
            # open(f, "w").write is executed after RETR suceeds and returns file binary data
            ftp.retrbinary("RETR {}".format(f), open(f, "wb").write)
            print("downloaded {}".format(f))
    ftp.quit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 2014-09-15
      • 2022-01-15
      • 1970-01-01
      • 2018-05-04
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多