6

次のコード

class SiteSpider(BaseSpider):
    name = "some_site.com"
    allowed_domains = ["some_site.com"]
    start_urls = [
        "some_site.com/something/another/PRODUCT-CATEGORY1_10652_-1__85667",
    ]
    rules = (
        Rule(SgmlLinkExtractor(allow=('some_site.com/something/another/PRODUCT-CATEGORY_(.*)', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(SgmlLinkExtractor(allow=('some_site.com/something/another/PRODUCT-DETAIL(.*)', )), callback="parse_item"),
    )
    def parse_item(self, response):
.... parse stuff

次のエラーをスローします

Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 1174, in mainLoop
    self.runUntilCurrent()
  File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 796, in runUntilCurrent
    call.func(*call.args, **call.kw)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 318, in callback
    self._startRunCallbacks(result)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 424, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 441, in _runCallbacks
    self.result = callback(self.result, *args, **kw)
  File "/usr/lib/pymodules/python2.6/scrapy/spider.py", line 62, in parse
    raise NotImplementedError
exceptions.NotImplementedError: 

コールバックを「parse」に変更し、関数を「parse」に変更すると、エラーは発生しませんが、何もスクレイピングされません。誤って parse メソッドをオーバーライドしている可能性があると考えて、「parse_items」に変更しました。リンクエクストラクタの設定が間違っているのでしょうか?

私がやりたいことは、CATEGORY ページの各 ITEM リンクを解析することです。私はこれを完全に間違っていますか?

4

2 に答える 2

9

BaseSpider を CrawlSpider に変更する必要がありました。ありがとうsrapyユーザー!

http://groups.google.com/group/scrapy-users/browse_thread/thread/4adaba51f7bcd0af#

ハイボブ、

BaseSpider から CrawlSpider に変更するとうまくいくのではないでしょうか?BaseSpider はルールを実装していないようです。次を参照してください。

http://doc.scrapy.org/topics/spiders.html?highlight=rule#scrapy.contr ...

-M

于 2011-03-11T16:55:42.063 に答える
4

デフォルトでは、scrapy はクラス内の解析関数を検索します。ここであなたのスパイダーには、解析機能がありません。parse の代わりに parse_item を指定しました。parse_item を parse に置き換えれば問題は解決します。または、spider.py の parse メソッドを parse_item のメソッドでオーバーライドできます。

于 2015-01-31T06:01:48.417 に答える