web-dev-qa-db-fra.com

Schéma manquant dans l'URL de la demande

Cela fait un moment que je suis bloqué sur ce bogue, le message d'erreur suivant est le suivant:

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

Code 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

Je suis à peu près sûr que cela a quelque chose à voir avec l'url que je demande à Scrapy de suivre dans LinkExtractor. Lors de leur extraction dans Shell, ils se présentent comme suit: 

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

Comparé à une autre URL extraite d'une araignée en activité:

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

J'ai jeté un coup d'œil à quelques questions sur SO, telles que Télécharger des photos avec du scrap mais en le lisant, je pense que mon problème peut être légèrement différent. 

J'ai aussi jeté un coup d'œil à ceci - http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html

ce qui explique que l'erreur est générée s'il manque à "self.urls" un ":". En examinant les start_urls que j'ai définis, je ne vois pas très bien pourquoi cette erreur s'afficherait car le schéma est clairement défini.

Merci d'avoir lu,

Toby

15
Toby

remplacez start_urls par:

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

ajouter l'URL avec 'http' ou 'https'

4
rikAtee

Comme @Guy a répondu précédemment, l'attribut start_urls doit être une liste. Le message exceptions.ValueError: Missing scheme in request url: h provient de cela: le "h" du message d'erreur est le premier caractère de " http: // www. bankofwow.com/ ", interprété comme une liste (de caractères)

allowed_domains doit également être une liste de domaines, sinon vous obtiendrez des requêtes filtrées "hors site".

Remplacez restrict_xpaths par 

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

il doit représenter une zone dans le document où trouver des liens, il ne doit pas s'agir d'URL de lien directement

De http://doc.scrapy.org/fr/latest/topics/link-extractors.html#sgmllinkextractor

restrict_xpaths (str ou list) - est un XPath (ou une liste de XPath) qui définit les régions de la réponse dans lesquelles les liens doivent être extraits. Si donné, seul le texte sélectionné par ces XPath sera analysé pour les liens. 

Enfin, il est habituel de définir ceux-ci en tant qu’attributs de classe au lieu de définir ceux de __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
paul trmbrth

Scheme a essentiellement une syntaxe comme

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

Des exemples de régimes populaires } _ incluent http(s), ftp, mailto, file, data et irc. Il y a pourrait aussi être } des termes tels que about ou about:blank nous sommes un peu familier avec.

C'est plus clair dans la description sur cette même page de définition:

                    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

Dans la question de Missing schemes, il semble qu'il manque une partie de [//[user:password@]Host[:port]] dans 

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

comme mentionné ci-dessus. 

J'ai eu un problème similaire où ce concept simple suffirait comme solution!

J'espère que cela aide certains.

1
Snail-Horn

remplacez start_urls par:

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

ça devrait marcher.

1
liaogx