Отсутствует схема в 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-адресом, который я просил, чтобы scopy следовал в LinkExtractor. При извлечении их в оболочку они выглядят примерно так:
data=u'cart.php?target=category&category_id=826'
По сравнению с другим URL, извлеченным из рабочего паука:
data=u'/path/someotherpath/category.php?query=someval'
Я взглянул на несколько вопросов по SO, таких как загрузка картинок с помощью scrapy, но после прочтения я думаю, что у меня может быть немного другая проблема.
Я также взглянул на это - http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html
который объясняет, что ошибка выдается, если self.urls пропускает ":", глядя на определение start_urls, которое я определил, я не могу понять, почему эта ошибка будет отображаться, поскольку схема четко определена.
Спасибо за прочтение,
Тоби
5 ответов
Менять start_urls
чтобы:
self.start_urls = ["http://www.bankofwow.com/"]
Как @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
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
Схема в основном имеет такой синтаксис
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
Примеры популярных схем включают
http(s)
,ftp
,mailto
,file
,data
, а такжеirc
, Там также могут быть такие термины, какabout
или жеabout:blank
мы немного знакомы с.
Это более ясно в описании на той же странице определения:
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
В вопросе о Missing schemes
кажется, что есть [//[user:password@]host[:port]]
часть отсутствует в
data=u'cart.php?target=category&category_id=826'
как уже упоминалось выше.
У меня была похожая проблема, где эта простая концепция была бы достаточным решением для меня!
Надеюсь, это поможет некоторым.
Менять start_urls
чтобы:
self.start_urls = ("http://www.domainname.com/",)
он должен работать.
yield{"Text": text, ^ IndentationError: undent не соответствует никакому внешнему уровню отступа
когда ошибка возникает при использовании возвышенного редактора, используется смешанное пространство и пространство вкладок, которое трудно найти, но простое решение - скопировать полный код в обычный текстовый документ
вы можете легко определить разницу в цикле for и предстоящих операторах, чтобы вы могли исправить это в блокноте, а затем скопировать его в возвышенном виде, код будет запущен
Ошибка вызвана тем, что start_urls в кортеже start_urls = ('http://quotes.toscrape.com/',)
измените statrs_url на список start_urls = ['http://quotes.toscrape.com/']