【问题标题】:Scrapy python error - Missing scheme in request URLScrapy python错误-请求URL中缺少方案
【发布时间】:2015-04-26 10:42:40
【问题描述】:

我正在尝试从受密码保护的 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  

【问题讨论】:

    标签: python web-crawler scrapy scrapy-spider


    【解决方案1】:

    您需要为 URL 添加方案:

    ftp://ftp.site.co.uk
    

    FTP URL 语法定义为:

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

    基本上,你这样做:

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

    在 Wikipedia 上阅读有关架构的更多信息:http://en.wikipedia.org/wiki/URI_scheme

    【讨论】:

    • 感谢您的回复。不过,我一直找不到任何有关添加方案的文档或示例。
    • 嗯,这不是scrapy特有的。它是特定于网络的。您只需将方案附加到 URL 即可添加方案。就像你有 http:// 的 HTTP URI's。
    • 劳伦斯 非常感谢您的帮助。不过,我的原始帖子中有产量请求,这不正确吗? def start_requests(self): yield Request('ftp.site.co.uk/feed.xml', meta={'ftp_user': 'test', 'ftp_password': 'test'})
    • 不正确。您缺少 ftp:// 部分。不要让ftp.site.co.uk 中的ftp 混淆你,那是不一样的。你需要它是ftp://ftp.site.co.uk
    • 有什么办法可以捕捉到这个错误吗?我尝试将它放在下载器和蜘蛛中间件中,但它似乎被放在中间件之前。
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2016-04-30
    • 2014-02-01
    • 1970-01-01
    • 2017-07-02
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多