请求网址中缺少方案

时间:2014-01-13 23:39:41

标签: python url scrapy relative

我一直坚持这个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

Scrapy代码:

    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 @width="25%" 
                          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

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

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

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

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

我已经看了几个关于SO的问题,比如Downloading pictures with scrapy,但是从阅读中我想我可能会遇到一个稍微不同的问题。

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

这解释了如果self.urls缺少“:”则会抛出错误,从查看我定义的start_urls开始,我无法理解为什么这个错误会显示,因为该方案已经明确定义。 / p>

感谢阅读,

托比

7 个答案:

答案 0 :(得分:21)

start_urls更改为:

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

答案 1 :(得分:5)

使用“http”或“https”

添加网址

答案 2 :(得分:4)

正如@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 @width="25%" 
                    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或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 @width="25%"
                  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

答案 3 :(得分:2)

Scheme基本上有类似

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

popular schemes的示例包括http(s)ftpmailtofiledatairc。   我们有aboutabout:blankcould also be个术语   有点熟悉。

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

                    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'

如上所述。

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

希望这会有所帮助。

答案 4 :(得分:1)

start_urls更改为:

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

它应该有用。

答案 5 :(得分:0)

  

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

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

您可以轻松地识别出for循环和后续语句之间的差异,因此您可以在记事本中更正它,然后将其复制并升华,这样代码便会运行

答案 6 :(得分:-1)

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

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