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
remplacez start_urls
par:
self.start_urls = ["http://www.bankofwow.com/"]
ajouter l'URL avec 'http' ou 'https'
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
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
etirc
. Il y a pourrait aussi être } des termes tels queabout
ouabout: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.
remplacez start_urls
par:
self.start_urls = ("http://www.domainname.com/",)
ça devrait marcher.