5

深さ> 1で実行するようにscrapyを構成できませんでした。次の3つのオプションを試しましたが、どれも機能せず、要約ログのrequest_depth_maxは常に1です:

1) 追加:

from scrapy.conf import settings
settings.overrides['DEPTH_LIMIT'] = 2

スパイダーファイルへ(サイトの例、サイトが異なるだけ)

-s2)オプションを指定してコマンドラインを実行:

/usr/bin/scrapy crawl -s DEPTH_LIMIT=2 mininova.org

settings.py3)とに追加scrapy.cfg:

DEPTH_LIMIT=2

1 以上に設定するにはどうすればよいですか?

4

3 に答える 3

4

warwaruk の言うとおりです。DEPTH_LIMIT 設定のデフォルト値は 0 です。つまり、「制限は課されていません」。

それでは、miniova をスクレイピングして、何が起こるか見てみましょう。ページから開始すると、today2 つの tor リンクがあることがわかります。

stav@maia:~$ scrapy shell http://www.mininova.org/today
2012-08-15 12:27:57-0500 [scrapy] INFO: Scrapy 0.15.1 started (bot: scrapybot)
>>> from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
>>> SgmlLinkExtractor(allow=['/tor/\d+']).extract_links(response)
[Link(url='http://www.mininova.org/tor/13204738', text=u'[APSKAFT-018] Apskaft presents: Musique Concrte', fragment='', nofollow=False), Link(url='http://www.mininova.org/tor/13204737', text=u'e4g020-graphite412', fragment='', nofollow=False)]

最初のリンクをスクレイピングしましょう。そのページには新しい tor リンクがなく、iteself へのリンクだけで、デフォルトでは再クロールされません (scrapy.http.Request(url[, ... dont_filter=False, . ..])):

>>> fetch('http://www.mininova.org/tor/13204738')
2012-08-15 12:30:11-0500 [default] DEBUG: Crawled (200) <GET http://www.mininova.org/tor/13204738> (referer: None)
>>> SgmlLinkExtractor(allow=['/tor/\d+']).extract_links(response)
[Link(url='http://www.mininova.org/tor/13204738', text=u'General information', fragment='', nofollow=False)]

うまくいきません。まだ深さ 1 です。別のリンクを試してみましょう。

>>> fetch('http://www.mininova.org/tor/13204737')
2012-08-15 12:31:20-0500 [default] DEBUG: Crawled (200) <GET http://www.mininova.org/tor/13204737> (referer: None)
[Link(url='http://www.mininova.org/tor/13204737', text=u'General information', fragment='', nofollow=False)]

いいえ、このページには、それ自体へのリンクも 1 つしか含まれておらず、これもフィルタリングされます。したがって、実際にはスクレイプするリンクがないため、Scrapy はスパイダーを閉じます (深さ ==1)。

于 2012-08-15T18:13:08.620 に答える
4

同様の問題がありました。follow=True定義時に設定するのに役立ちましたRule

followこのルールで抽出された各応答からリンクをたどるかどうかを指定するブール値です。の場合callbackNone follow デフォルトでTrue、それ以外の場合はデフォルトですFalse

于 2013-05-10T12:19:42.513 に答える
1

DEPTH_LIMIT設定のデフォルト値は、0つまり「制限なし」です。

あなたが書いた:

request_depth_max要約ログでは常に1

ログに表示されるのは統計であり、設定ではありません。それは、最初のコールバックから他のリクエストが生成されていないことを意味するためですrequest_depth_max1

何が起こっているのかを理解するには、スパイダー コードを表示する必要があります。

しかし、別の質問を作成してください。

アップデート:

ああ、スクレイピーなイントロのために mininova Spider を実行しているのですね:

class MininovaSpider(CrawlSpider):

    name = 'mininova.org'
    allowed_domains = ['mininova.org']
    start_urls = ['http://www.mininova.org/today']
    rules = [Rule(SgmlLinkExtractor(allow=['/tor/\d+']), 'parse_torrent')]

    def parse_torrent(self, response):
        x = HtmlXPathSelector(response)

        torrent = TorrentItem()
        torrent['url'] = response.url
        torrent['name'] = x.select("//h1/text()").extract()
        torrent['description'] = x.select("//div[@id='description']").extract()
        torrent['size'] = x.select("//div[@id='info-left']/p[2]/text()[2]").extract()
        return torrent

コードからわかるように、スパイダーは他のページにリクエストを発行することはなく、トップ レベルのページからすべてのデータをスクレイピングします。そのため、最大深度は 1 です。

他のページへのリンクをたどる独自のスパイダーを作成すると、最大深度は 1 より大きくなります。

于 2012-08-15T04:56:44.470 に答える