我一直坚持这个bug,以下错误信息如下:
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有关,我要求在LinkExtractor中遵循scrapy。在shell中提取它们时,它们看起来像这样:
data=u'cart.php?target=category&category_id=826'
与从工作蜘蛛中提取的另一个网址相比:
data=u'/path/someotherpath/category.php?query=someval'
我已经看了几个关于SO的问题,比如Downloading pictures with scrapy,但是从阅读中我想我可能会遇到一个稍微不同的问题。
我也看过这个 - http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html
这解释了如果self.urls缺少“:”则会抛出错误,从查看我定义的start_urls开始,我无法理解为什么这个错误会显示,因为该方案已经明确定义。 / p>
感谢阅读,
托比
答案 0 :(得分:21)
将start_urls
更改为:
self.start_urls = ["http://www.bankofwow.com/"]
答案 1 :(得分:5)
使用“http”或“https”
添加网址答案 2 :(得分:4)
正如@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
答案 3 :(得分:2)
Scheme基本上有类似
的语法scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
popular schemes的示例包括
http(s)
,ftp
,mailto
,file
,data
和irc
。 我们有about
或about:blank
等could also be个术语 有点熟悉。
在相同定义页面的描述中更清楚:
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'
如上所述。
我有一个类似的问题,这个简单的概念就足以解决我的问题了!
希望这会有所帮助。
答案 4 :(得分:1)
将start_urls
更改为:
self.start_urls = ("http://www.domainname.com/",)
它应该有用。
答案 5 :(得分:0)
yield {“文字”:文字, ^ IndentationError:unindent与任何外部缩进级别都不匹配
使用sublime编辑器出现错误时,这是混合空间和制表符空间,很难找到,但是一个简单的解决方案将完整代码复制到普通文本文档中
您可以轻松地识别出for循环和后续语句之间的差异,因此您可以在记事本中更正它,然后将其复制并升华,这样代码便会运行
答案 6 :(得分:-1)
错误是因为元组中的start_urls start_urls =('http://quotes.toscrape.com/',)
将statrs_url更改为list start_urls = ['http://quotes.toscrape.com/']