Ошибка Scrapy python - отсутствует схема в URL-адресе запроса

Я пытаюсь получить файл с FTP-сервера, защищенного паролем. Это код, который я использую:

import scrapy
from scrapy.contrib.spiders import XMLFeedSpider
from scrapy.http import Request
from crawler.items import CrawlerItem

class SiteSpider(XMLFeedSpider):
    name = 'site'
    allowed_domains = ['ftp.site.co.uk']
    itertag = 'item'

    def start_requests(self):
        yield Request('ftp.site.co.uk/feed.xml',
            meta={'ftp_user': 'test', 'ftp_password': 'test'})

    def parse_node(self, response, selector):
        item = CrawlerItem()
        item['title'] = (selector.xpath('//title/text()').extract() or [''])[0]      
        return item

Это ошибка трассировки, которую я получаю:

        Traceback (most recent call last):                                                              
          File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 1192, in run     
            self.mainLoop()                                                                             
          File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 1201, in mainLoop
            self.runUntilCurrent()                                                                      
          File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 824, in runUntilC
urrent                                                                                                  
            call.func(*call.args, **call.kw)                                                            
          File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/reactor.py", line 41, in __call__   
            return self._func(*self._a, **self._kw)                                                     
        --- <exception caught here> ---                                                                 
          File "/usr/local/lib/python2.7/dist-packages/scrapy/core/engine.py", line 112, in _next_reques
t                                                                                                       
            request = next(slot.start_requests)                                                         
          File "/var/www/spider/crawler/spiders/site.py", line 13, in start_requests                 
            meta={'ftp_user': 'test', 'ftp_password': 'test'})                                
          File "/usr/local/lib/python2.7/dist-packages/scrapy/http/request/__init__.py", line 26, in __i
nit__                                                                                                   
            self._set_url(url)                                                                          
          File "/usr/local/lib/python2.7/dist-packages/scrapy/http/request/__init__.py", line 61, in _se
t_url                                                                                                   
            raise ValueError('Missing scheme in request url: %s' % self._url)                           
        exceptions.ValueError: Missing scheme in request url: ftp.site.co.uk/f
eed.xml  

person Jimmy    schedule 26.04.2015    source источник


Ответы (1)


Вам нужно добавить схему для URL:

ftp://ftp.site.co.uk

Синтаксис URL-адреса FTP определяется следующим образом:

ftp://[<user>[:<password>]@]<host>[:<port>]/<url-path>

В основном, вы делаете это:

yield Request('ftp://ftp.site.co.uk/feed.xml', ...)

Подробнее о схемах читайте в Википедии: http://en.wikipedia.org/wiki/URI_scheme.

person bosnjak    schedule 26.04.2015
comment
Спасибо за ваш ответ. Однако мне не удалось найти какую-либо документацию или примеры для scrapy при добавлении схемы. - person Jimmy; 26.04.2015
comment
Ну, это не специфично для скрапинга. Это скорее специфично для сети. Вы добавляете схему, просто добавляя ее к URL-адресу. Например, у вас есть http:// для HTTP URI. - person bosnjak; 26.04.2015
comment
Лоуренс, я очень ценю помощь. У меня есть запрос на доходность в моем исходном сообщении, разве это не так? def start_requests(self): yield Request('ftp.site.co.uk/feed.xml', meta={'ftp_user': 'test', 'ftp_password': 'test'}) - person Jimmy; 26.04.2015
comment
Это неправильно. Вы пропустили часть ftp://. Не позволяйте ftp в ftp.site.co.uk сбить вас с толку, это не одно и то же. Вам нужно, чтобы это было ftp://ftp.site.co.uk - person bosnjak; 26.04.2015
comment
есть ли способ поймать эту ошибку? Я пытался поместить его в загрузчик, а также в промежуточное программное обеспечение паука, но, похоже, его бросают перед промежуточным программным обеспечением. - person Raheel; 17.07.2017
comment
Вы не можете поймать это в загрузчике, потому что движок должен решить, какой загрузчик использовать на основе схемы. Этого легко избежать, правильно указав URL. Какой конкретный случай вы имеете в виду, что вам нужно поймать эту ошибку? - person bosnjak; 25.07.2017