web-dev-qa-db-ja.com

リクエスト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

スクレイピーコード:

    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

LinkExtractorでフォローするように要求しているURLと関係があると確信しています。シェルでそれらを抽出すると、次のようになります。

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

動作中のスパイダーから抽出された別のURLと比較して:

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

scrapyで画像をダウンロードする など、Stack Overflowに関するいくつかの質問を見てきましたが、それを読んでいると、少し異なる問題があるかもしれません。

私もこれを見ました- http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html

Self.URLsに「:」がないとエラーがスローされることを説明します。定義したstart_urlsを見ると、スキームが明確に定義されているため、このエラーが表示される理由はわかりません。

19
Toby

変化する start_urls to:

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

「http」または「https」をURLに追加します

5
rikAtee

@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
5
paul trmbrth

Schemeは基本的に次のような構文を持っています

_scheme:[//[user:password@]Host[:port]][/]path[?query][#fragment]
_

popular schemes の例には、http(s)ftpmailtofiledata、および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:password@]Host[:port]]_部分が欠落しているようです

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

上記のように。

この単純な概念で十分な解決策が得られるという、同様の問題がありました!

これが助けになることを願っています。

2
Snail-Horn

変化する start_urls to:

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

動作するはずです。

1
liaogx