Esquema faltante en la url de solicitud

He estado atascado en este error por un tiempo, el siguiente mensaje de error es el siguiente:

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 

Código 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 

Estoy bastante seguro de que es algo que ver con la URL que le pido a Scrap que siga en el LinkExtractor. Al extraerlos en shell se ven algo así:

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

En comparación con otra url extraída de una araña de trabajo:

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

He echado un vistazo a algunas preguntas sobre SO, como la descarga de imágenes con recortes, pero al leerlo creo que puedo tener un problema ligeramente diferente.

También eché un vistazo a esto: http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html

lo que explica que se genere el error si a self.urls le falta un “:”, al mirar los start_urls que he definido, no puedo ver por qué este error se mostraría, ya que el esquema está claramente definido.

Gracias por leer,

Toby

cambiar start_urls a:

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

anteponer url con ‘http’ o ‘https’

Como @Guy respondió anteriormente, el atributo start_urls debe ser una lista, el mensaje de exceptions.ValueError: Missing scheme in request url: h proviene de eso: la ” h ” en el mensaje de error es el primer carácter de ” http: // www. bankofwow.com/ “, interpretado como una lista (de caracteres)

allowed_domains también debe ser una lista de dominios, de lo contrario, obtendrá solicitudes “externas” filtradas.

Cambiar restrict_xpaths rutas a

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

debe representar un área en el documento donde encontrar enlaces, no debe ser URL de enlace directamente

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

restrict_xpaths (str o list): es un XPath (o lista de XPath) que define las regiones dentro de la respuesta desde donde se deben extraer los enlaces. Si se da, solo el texto seleccionado por esos XPath será escaneado en busca de enlaces.

Finalmente, es costumbre definir estos como atributos de clase en lugar de configuraciones en __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 

Esquema básicamente tiene una syntax como

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

Ejemplos de esquemas populares incluyen http(s) , ftp , mailto , file , data e irc . También podría haber términos como about o about:blank que estamos algo familiarizados.

Es más claro en la descripción en esa misma página de definición:

  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 

En la pregunta de Missing schemes que Missing schemes , parece que falta la parte [//[user:password@]host[:port]] en

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

como se ha mencionado más arriba.

¡Tenía un problema similar donde este simple concepto sería la solución para mí!

Espero que esto ayude a algunos.

cambiar start_urls a:

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

deberia de funcionar.