2017-06-13 9 views
1

ページネーションを持つサイトから記事をスクラップします。基本的には、すべてのページが記事リンクのリストであり、スパイダーはparse_articleメソッドのページ上のリンクをたどり、次のページリンクをたどります。しかし、特定の数の記事が掻き取られた後、これを停止する方法はありますか?たとえば、これは私がこれまでcrawlspiderを使用しているものである:状態のページングを中止していますか?

rules = (

    #next page rule: 
    Rule(LinkExtractor(restrict_xpaths="//a[@class='next']"),follow=True) 

    #Extract all internal links which follows this regex: 
    Rule(LinkExtractor(allow=('REGEXHERE',),deny=()),callback='parse_article'), 
) 

def parse_article(self, response): 
    #do parsing stuff here 

私は150件の記事を解析されてきたら、次のページを次のように停止します。私は150を少し掻き分けても問題はありません。その数字を打つと次のページに行くのを止めたいです。それを行う方法はありますか? parse_articleメソッドにカウンタを持つような何か? scrapyにちょうど新しいので、私は何を試していいのかわかりません.... depth_limitを調べましたが、私はそれが私が探しているものではないと確信しています。

ご協力いただきありがとうございます、ありがとうございます!

答えて

4

あなたは設定して、それを達成できます。あなたのプロジェクトの設定で

CLOSESPIDER_ITEMCOUNT = 150

を。

プロジェクトで複数のクモを持っており、ちょうど特定の一つは、この設定によって影響を受けることにしたい場合は、custom_settingsクラス変数で設定は:

custom_settings = { 'CLOSESPIDER_ITEMCOUNT': 150 } 
+0

感謝を!しかし、複数のスパイダーを持つプロジェクトでは、このCLOSESPIDER_ITEMCOUNTを1つのスパイダーにのみ適用させることは可能ですか? – ocean800

+1

@ ocean800私は自分の答えを更新しました。試してみてください期待どおりに動作したら教えてください –

+0

遅く返事を申し訳ありませんが、うまくいきました:) – ocean800

1

私はクモを取るアプローチがにあります実際にはdonescrapingフラグを持っていて、私はそれぞれのparse_ *関数の最初のものをチェックし、結果の空のリストを返します。

これは、すでにダウンロードキューにあるアイテムとURLがMOREアイテムをフェッチしていない間に、処理が完了するようにするという正常な動作を追加します。

私はCLOSESPIDER_ITEMCOUNTを一度も使用していないので、「正常に」スパイダーを閉じてもわかりません。私はそれがすべてのparse関数の開始時に

を期待していません:提案のための

#early exit if done scraping 
    if self.donescraping: 
     return None 
+1

場合によっては、解析関数によって 'return []'が必要な場合があります。 :) – RabidCicada

+0

答えをありがとう!ちょうどもっと理解しようとしています - クモはここでどれくらい閉じていますか?私は、 'CrawlSpider' /' LinkExtractor'がより多くのリンクをクロールするのを止めるパース関数の 'None' /' [] '応答を返す方法を理解していませんか? – ocean800

+1

スパイダーがダウンロードキューの内容を使い果たすと、自動的に閉じます。私の解決策は、即座に終了するのではなく、現在収集されているアイテムの処理が終了した後、アイテムを増やすことなく正常に閉じることです。 – RabidCicada

関連する問題