Usar o Scrapy para rastejar um servidor FTP público

Como posso fazer o Scrapy crawl num servidor FTP que não requer um nome de utilizador e uma senha? Tentei adicionar a url aos urls iniciais, mas o Scrapy requer um nome de utilizador e uma senha para o acesso FTP. Eu sobrepus {[[0]} para fornecer um padrão (o nome de usuário 'anônimo' e uma senha em branco funciona quando eu tento com o comando Linux ftp), mas agora eu recebo 550 respostas do servidor.

Qual é o caminho certo para rastejar servidores FTP com Scrapy? trabalhar com todos os servidores FTP que não necessitam de um utilizador ou senha de acesso?

Author: alecxe, 2015-01-05

1 answers

Não está documentado, mas o Scrapy tem esta funcionalidade incorporada. Existe um FTPDownloadHandler que lida com a transferência FTP usando o twisted's FTPClient. Você não precisa chamá-lo diretamente, ele iria automaticamente ligar Se houver um url ftp solicitado.

Na tua aranha, continua a usar scrapy.http.Request classe, mas forneça as credenciais ftp no dicionário meta em ftp_user e ftp_password itens:

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

ftp_user e ftp_password são necessários. Também há duas chaves opcionais que pode fornecer:

  • ftp_passive (por omissão, activo) define o modo passivo de ligação FTP
  • ftp_local_filename:
    • Se não for dado, os dados do ficheiro virão na resposta.corpo, como uma resposta escamosa normal, o que implica que todo o arquivo estará na memória.
    • Se for dado, os dados do ficheiro serão gravados num ficheiro local com o nome indicado Isso ajuda ao baixar arquivos muito grandes para evitar problemas de memória. Além disso, para conveniência o nome do arquivo local também será dado no corpo de resposta.

Este último é útil quando você precisa baixar um arquivo e salvá-lo localmente sem processar a resposta no callback aranha.

Quanto à utilização anónima, as credenciais a fornecer dependem do próprio servidor ftp. O Usuário é "anônimo" e senha é geralmente o seu e-mail, qualquer senha ou em branco.

Para tua informação, citação da especificação :

FTP anónimo é um meio pelo qual os sites de arquivo permitem o acesso geral aos seus arquivos de informação. Estes sites criam um especial conta chamada "anónima". O utilizador "anónimo" tem acesso limitado direitos ao host do arquivo, bem como algumas restrições operacionais. Em de fato, as únicas operações permitidas são o login usando FTP, listando o conteúdo de um conjunto limitado de diretórios, e recuperando arquivos. Alguns sites limitam o conteúdo de um diretório listando um usuário anônimo também consigo ver. Note que os usuários "anônimos" geralmente não são permitidos para transferir arquivos para o site de arquivo, mas só pode recuperar arquivos de tal site.

Tradicionalmente, esta conta de utilizador anónima especial aceita qualquer texto como senha, embora seja comum usar a senha endereço de" convidado " ou de correio electrónico (e-mail). Alguns locais de arquivo agora Peça explicitamente o endereço de E-mail do Usuário e não permitirá login com a senha de "convidado". Fornecimento de um e-mail o endereço é a cortesia que permite aos operadores do site de arquivo ter alguma ideia de quem é usando os seus serviços.

Experimentá-lo na consola normalmente ajuda a ver qual a senha que você deve usar, a mensagem de boas-vindas geralmente anota explicitamente os requisitos de senha. Exemplo do mundo Real:

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

Aqui está um exemplo de trabalho para 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

Se você executar a aranha, você veria o conteúdo do arquivo README na consola:

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. 
...
 12
Author: alecxe, 2015-01-12 04:23:59