2016-08-18 13 views
0

私は最近、ウェブサイトのスパイダーに取り組んでいました。サイトが無限のページ数を要求しているのに気付きました。など虐待 - ページ分割ブラックホールを避ける方法は?

彼らは唯一のコンテンツのいくつかのページを持っていたので、それはまだ次のリンクやURLを生成するであろう...?ページ= 400、...?ページ= 401、

コンテンツのdidn URLは変更されません。コンテンツが変化しなくなったときに、ページングの後でScrapyを停止する方法はありますか?または私はカスタムをコード化することができます。

+0

あなたは(あなたは、XPath経由でテキストを分析でき、ページタイトルや結果を示す見出し、すなわち、その変化何かを追跡し、それはもうしない場合に停止する必要がありますクエリは明らかに)。 – Jan

+0

しかし、それを掻き集めてLinkExtractorが使用できないようにするURLにリンクするにはどうすればいいですか?これをCrawlSpiderに統合することは私の外にあります。 –

答えて

1

コンテンツが変更されない場合は、現在のページの内容と前のページの内容を比較し、同じ場合はクロールを解除します。例えば

def parse(self, response): 
    product_urls = response.xpath("//a/@href").extract() 
    # check last page 
    if response.meta.get('prev_urls') == product_urls: 
     logging.info('reached the last page at: {}'.format(response.url)) 
     return # reached the last page 
    # crawl products 
    for url in product_urls: 
     yield Request(url, self.parse_product) 
    # create next page url 
    next_page = response.meta.get('page', 0) + 1 
    next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url) 
    # now for the next page carry some data in meta 
    yield Request(next_url, 
        meta={'prev_urls': product_urls, 
         'page': next_page} 
+0

'yields'と' return'を混ぜることはできませんが、製品リンクに限定するという一般的な考え方は面白いです。また、 'Request'オブジェクトを生成する前に' response.meta.get( 'prev_urls')== product_urls'をテストすることもできます。 –

+1

@paultrmbrthありがとう、最初に小切手を移動してください。 returnとyieldは、 'return'が何も返さない限り、python2でうまく動作しますが、ここでは' break'のように動作します。 – Granitosaurus

+0

ああ、そうです。私は決して知りませんでした:) Thx –

関連する問題