私はしばらくの間このバグにこだわっています。次のエラーメッセージは次のとおりです。
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
スクレイピーコード:
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
LinkExtractorでフォローするように要求しているURLと関係があると確信しています。シェルでそれらを抽出すると、次のようになります。
data=u'cart.php?target=category&category_id=826'
動作中のスパイダーから抽出された別のURLと比較して:
data=u'/path/someotherpath/category.php?query=someval'
scrapyで画像をダウンロードする など、Stack Overflowに関するいくつかの質問を見てきましたが、それを読んでいると、少し異なる問題があるかもしれません。
私もこれを見ました- http://static.scrapy.org/coverage-report/scrapy_http_request___init__.html
Self.URLsに「:」がないとエラーがスローされることを説明します。定義したstart_urlsを見ると、スキームが明確に定義されているため、このエラーが表示される理由はわかりません。
変化する start_urls
to:
self.start_urls = ["http://www.bankofwow.com/"]
「http」または「https」をURLに追加します
@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
Schemeは基本的に次のような構文を持っています
_scheme:[//[user:password@]Host[:port]][/]path[?query][#fragment]
_
popular schemes の例には、
http(s)
、ftp
、mailto
、file
、data
、およびirc
が含まれます。そこには 可能性もありますabout
や_about:blank
_のような用語があります。
同じ定義ページの説明でより明確になります。
_ 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
_
_Missing schemes
_の質問では、_[//[user:password@]Host[:port]]
_部分が欠落しているようです
_data=u'cart.php?target=category&category_id=826'
_
上記のように。
この単純な概念で十分な解決策が得られるという、同様の問題がありました!
これが助けになることを願っています。
変化する start_urls
to:
self.start_urls = ("http://www.domainname.com/",)
動作するはずです。