请求 URL 中缺少方案

Posted

技术标签:

【中文标题】请求 URL 中缺少方案【英文标题】:Missing scheme in request URL 【发布时间】:2014-02-01 22:07:06 【问题描述】:

在这个bug上卡了一段时间,下面的错误信息如下:

File "C:\Python27\lib\site-packages\scrapy-0.20.2-py2.7.egg\scrapy\http\request\__init__.py", line 61, in _set_url
            raise ValueError('Missing scheme in request url: %s' % self._url)
            exceptions.ValueError: Missing scheme in request url: h

抓取代码:

    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from scrapy.http import Request
    from spyder.items import SypderItem

    import sys
    import mysqldb
    import hashlib
    from scrapy import signals
    from scrapy.xlib.pydispatch import dispatcher

    # _*_ coding: utf-8 _*_

    class some_Spyder(CrawlSpider):
        name = "spyder"

        def __init__(self, *a, **kw):
            # catch the spider stopping
            # dispatcher.connect(self.spider_closed, signals.spider_closed)
            # dispatcher.connect(self.on_engine_stopped, signals.engine_stopped)

            self.allowed_domains = "domainname.com"
            self.start_urls = "http://www.domainname.com/"
            self.xpaths = '''//td[@class="CatBg" and @ 
                          and @valign="top" and @align="center"]
                          /table[@cellspacing="0"]//tr/td/a/@href'''

            self.rules = (
                Rule(SgmlLinkExtractor(restrict_xpaths=(self.xpaths))),
                Rule(SgmlLinkExtractor(allow=('cart.php?')), callback='parse_items'),
                )

            super(spyder, self).__init__(*a, **kw)

        def parse_items(self, response):
            sel = Selector(response)
            items = []
            listings = sel.xpath('//*[@id="tabContent"]/table/tr')

            item = IgeItem()
            item["header"] = sel.xpath('//td[@valign="center"]/h1/text()')

            items.append(item)
            return items

我很确定这与我要求 scrapy 在 LinkExtractor 中跟踪的 URL 有关。在 shell 中提取它们时,它们看起来像这样:

data=u'cart.php?target=category&category_id=826'

与从工作蜘蛛中提取的另一个 URL 相比:

data=u'/path/someotherpath/category.php?query=someval'

我看过一些关于 Stack Overflow 的问题,例如 Downloading pictures with scrapy,但从阅读中我想我可能有一个稍微不同的问题。

我也看过这个 - http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html

这解释了如果 self.URLs 缺少“:”则会引发错误,通过查看我定义的 start_urls 我不太明白为什么会显示此错误,因为该方案已明确定义。

【问题讨论】:

【参考方案1】:

yield“文本”:文本, ^ IndentationError: unindent 不匹配任何外部缩进级别

当使用 sublime 编辑器出现错误时,这是​​使用混合空间和制表符空间,很难找到,但一个简单的解决方案是将完整代码复制到普通文本文档中

您可以轻松识别 for 循环和即将出现的语句下的差异,以便您可以在记事本中更正它,然后将其复制到 sublime 中,代码将运行

【讨论】:

【参考方案2】:

错误是因为元组中的 start_urls start_urls = ('http://quotes.toscrape.com/',)

将 statrs_url 更改为列表 start_urls = ['http://quotes.toscrape.com/']

【讨论】:

这与接受的答案相同,但分析错误(问题中的start_urls 是字符串,而不是元组)【参考方案3】:

start_urls 更改为:

self.start_urls = ("http://www.domainname.com/",)

它应该可以工作。

【讨论】:

【参考方案4】:

方案基本上具有类似的语法

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

popular schemes 的示例包括 http(s)ftpmailtofiledatairc。 有could also be 像aboutabout:blank 这样的术语我们是 有点熟悉。

在同一定义页面的描述中更清楚:

                    hierarchical part
        ┌───────────────────┴─────────────────────┐
                    authority               path
        ┌───────────────┴───────────────┐┌───┴────┐
  abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
  └┬┘   └───────┬───────┘ └────┬────┘ └┬┘           └─────────┬─────────┘ └──┬──┘
scheme  user information     host     port                  query         fragment

  urn:example:mammal:monotreme:echidna
  └┬┘ └──────────────┬───────────────┘
scheme              path

Missing schemes 的问题中,[//[user:password@]host[:port]] 似乎缺少部分

data=u'cart.php?target=category&category_id=826'

如上所述。

我有一个类似的问题,这个简单的概念足以解决我的问题!

希望这会有所帮助。

【讨论】:

【参考方案5】:

正如@Guy之前回答的那样,start_urls属性必须是一个列表,exceptions.ValueError: Missing scheme in request url: h消息来自于:错误消息中的“h”是“http://www.bankofwow.com/”的第一个字符,解释为(字符的)列表

allowed_domains 也必须是域列表,否则您将收到过滤后的“异地”请求。

restrict_xpaths更改为

self.xpaths = """//td[@class="CatBg" and @ 
                    and @valign="top" and @align="center"]
                   /table[@cellspacing="0"]//tr/td"""

它应该代表文档中可以找到链接的区域,它不应该是直接链接的 URL

来自http://doc.scrapy.org/en/latest/topics/link-extractors.html#sgmllinkextractor

restrict_xpaths (str or list) – 是一个 XPath(或 XPath 的列表),它定义了响应中应该从中提取链接的区域。如果给定,则仅扫描由这些 XPath 选择的文本以查找链接。

最后,习惯上将这些定义为类属性,而不是设置__init__中的那些:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.http import Request
from bow.items import BowItem

import sys
import MySQLdb
import hashlib
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher

# _*_ coding: utf-8 _*_

class bankOfWow_spider(CrawlSpider):
    name = "bankofwow"

    allowed_domains = ["bankofwow.com"]
    start_urls = ["http://www.bankofwow.com/"]
    xpaths = '''//td[@class="CatBg" and @
                  and @valign="top" and @align="center"]
                  /table[@cellspacing="0"]//tr/td'''

    rules = (
        Rule(SgmlLinkExtractor(restrict_xpaths=(xpaths,))),
        Rule(SgmlLinkExtractor(allow=('cart.php?')), callback='parse_items'),
        )

    def __init__(self, *a, **kw):
        # catch the spider stopping
        # dispatcher.connect(self.spider_closed, signals.spider_closed)
        # dispatcher.connect(self.on_engine_stopped, signals.engine_stopped)
        super(bankOfWow_spider, self).__init__(*a, **kw)

    def parse_items(self, response):
        sel = Selector(response)
        items = []
        listings = sel.xpath('//*[@id="tabContent"]/table/tr')

        item = IgeItem()
        item["header"] = sel.xpath('//td[@valign="center"]/h1/text()')

        items.append(item)
        return items

【讨论】:

感谢您的回复 :)。它仍然抛出同样的错误。感谢文档中的引用,以后我一定会牢记这一点!万一人们想知道,我已经用 Xpath Checker 测试了 xpath,它列出了正确的链接:) 当我有更多的声誉时,我会 +1 这个,因为这很有用。再次感谢:) 我刚刚阅读了您修改后的答案,再次感谢您!事实上,我遇到了另一个小问题,你在 SO 上的一个答案再次帮助了我,也感谢你:)。我会确保按照您的建议进行修改。不知道为什么这个答案被否定了,这个人可能会给出他们的理由吗?【参考方案6】:

start_urls 更改为:

self.start_urls = ["http://www.bankofwow.com/"]

【讨论】:

感谢您的回复!你的意思是这样吗:self.xpath = 'http://www.bankofwow.com/' + '//td[@class="CatBg" and @width="25%" and @valign="top" and @align="center"]/table[@cellspacing="0"]//tr/td/a/@href' 我已经试过了,不幸的是我得到了同样的错误 我很抱歉,我有点脑子放屁,我说该域包含在工作蜘蛛中,事实并非如此。 这成功了,很抱歉捏造了这个问题。现在会接受:) 它对我不起作用。仍然是同样的错误。但这解决了我的问题***.com/questions/27516339/…【参考方案7】:

在网址前加上“http”或“https”

【讨论】:

这是获得相同错误的另一种方法。写一个不带“http”的网址。 http 或 https 必须在那里,但删除 www 部分以避免扭曲的互联网错误。

以上是关于请求 URL 中缺少方案的主要内容,如果未能解决你的问题,请参考以下文章

缺少 Access-Control-Allow-Origin 时的跨域请求

POST请求中缺少授权标头[重复]

为啥请求和 urllib2 缺少网页中的一些文本?

tt语音请求缺少或未设置appid

请求 OAUTH 令牌调查猴子 v3 时缺少参数

Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?