【问题标题】:Using Scrapy to crawl a public FTP server使用 Scrapy 爬取公共 FTP 服务器
【发布时间】:2015-03-02 11:08:39
【问题描述】:

如何让 Scrapy 抓取不需要用户名和密码的 FTP 服务器?我尝试将 url 添加到起始 url,但 Scrapy 需要用户名和密码才能访问 FTP。我已经覆盖start_requests() 以提供默认值(当我使用Linux 的ftp 命令尝试它时,用户名'anonymous' 和空白密码有效),但我现在从服务器收到550 个响应。

使用 Scrapy 抓取 FTP 服务器的正确方法是什么 - 理想情况下,该方法适用于所有不需要用户名或密码即可访问的 FTP 服务器?

【问题讨论】:

    标签: python ftp web-scraping scrapy twisted


    【解决方案1】:

    没有记录,但是 Scrapy 内置了这个功能。有一个FTPDownloadHandler 使用twisted 的FTPClient 处理FTP 下载。您不需要直接调用它,如果请求了ftp url,它会automagically turn on

    在您的蜘蛛中,继续使用scrapy.http.Request 类,但在ftp_userftp_password 项中的meta 字典中提供ftp 凭据:

    yield Request(url, meta={'ftp_user': 'user', 'ftp_password': 'password'})
    

    ftp_userftp_password 是必需的。您还可以提供two optional keys

    • ftp_passive(默认启用)设置 FTP 连接被动模式
    • ftp_local_filename:
      • 如果没有给出,文件数据将进入response.body,作为一个普通的scrapy Response, 这意味着整个文件将在内存中。
      • 如果给定,文件数据将以给定名称保存在本地文件中 这有助于下载非常大的文件以避免内存问题。此外,对于 为方便起见,本地文件名也将在响应正文中给出。

    当您需要下载文件并将其保存在本地而不处理蜘蛛回调中的响应时,后者很有用。

    至于匿名使用,提供什么凭据取决于 ftp 服务器本身。用户是“匿名的”,密码通常是您的电子邮件、任何密码或空白。

    仅供参考,引用自specification

    匿名 FTP 是存档站点允许一般访问的一种方式 到他们的信息档案。这些网站创造了一个特殊的 称为“匿名”的帐户。用户“匿名”的访问权限有限 存档主机的权利,以及一些操作限制。在 事实上,唯一允许的操作是使用 FTP 登录,列出 一组有限目录的内容,并检索文件。 一些网站限制列出匿名用户的目录的内容 也可以看到。请注意,通常不允许“匿名”用户 将文件传输到存档站点,但只能检索文件 来自这样的网站。

    传统上,这个特殊的匿名用户帐户接受任何字符串 作为密码,尽管通常使用密码 “客人”或某人的电子邮件(e-mail)地址。一些档案网站 现在明确询问用户的电子邮件地址并且不允许 使用“访客”密码登录。提供电子邮件地址是 礼貌,允许存档站点操作员了解谁是 使用他们的服务。

    在控制台上尝试通常有助于了解您应该使用什么密码,欢迎消息通常会明确说明密码要求。真实世界的例子:

    $ ftp anonymous@ftp.stratus.com
    Connected to icebox.stratus.com.
    220 Stratus-FTP-server
    331 Anonymous login ok, send your complete email address as your password.
    Password: 
    

    这是mozilla public FTP 的工作示例:

    import scrapy
    from scrapy.http import Request
    
    class FtpSpider(scrapy.Spider):
        name = "mozilla"
        allowed_domains = ["ftp.mozilla.org"]
    
        handle_httpstatus_list = [404]
    
        def start_requests(self):
            yield Request('ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/README',
                          meta={'ftp_user': 'anonymous', 'ftp_password': ''})
    
        def parse(self, response):
            print response.body
    

    如果你运行蜘蛛,你会在控制台上看到README file 的内容:

    Older releases have known security vulnerablities, which are disclosed at 
    
      https://www.mozilla.org/security/known-vulnerabilities/
    
    Mozilla strongly recommends you do not use them, as you are at risk of your computer 
    being compromised. 
    ...
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多