Отсутствует схема в URL запроса

Я застрял на этой ошибке некоторое время, следующее сообщение об ошибке выглядит следующим образом:

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-адресом, который я просил, чтобы scrap следовал в LinkExtractor. При извлечении их в оболочку они выглядят примерно так:

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

По сравнению с другим URL-адресом, извлеченным из рабочего паука:

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

Я посмотрел на несколько вопросов о Кару, таких как Загрузка картинок с помощью скрапа, но, читая его, я думаю, что у меня может быть немного другая проблема.

Я также взглянул на это - http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html

Что объясняет, что ошибка выдается, если self.URLs пропускает ":", глядя на определение start_urls, которое я определил, я не могу понять, почему эта ошибка будет отображаться, поскольку схема четко определена.

Ответ 1

измените start_urls на:

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

Ответ 2

добавить URL с 'http' или 'https'

Ответ 3

Как отвечал ранее @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

Ответ 4

В принципе схема имеет такой синтаксис, как

scheme:[//[user:[email protected]]host[:port]][/]path[?query][#fragment]

Примеры популярных схем включают http(s), ftp, mailto, file, data и irc. Там также может быть термины, такие как about или about:blank, мы несколько знакомый с.

Это более ясно в описании на той же странице определения:

                    hierarchical part
        ┌───────────────────┴─────────────────────┐
                    authority               path
        ┌───────────────┴───────────────┐┌───┴────┐
  abc://username:[email protected]: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:[email protected]]host[:port]]
data=u'cart.php?target=category&category_id=826'

как упомянуто выше.

У меня была аналогичная проблема, где эта простая концепция была бы достаточной для меня!

Надеюсь, это поможет некоторым.

Ответ 5

измените start_urls на:

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

он должен работать.