Scrapy: как проверить и остановить сканирование

Я просматриваю список страниц, где на каждой странице есть список URL-адресов, которые мне также нужно проанализировать. Я просматриваю эти первые страницы, но я априори не знаю, когда мне остановить сканирование. Например, этот еще предстоит проанализировать:

http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=183

но не этот не потому, что он уже пуст:

http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=200

Итак, мой вопрос: как я могу остановить поискового робота с условием, обнаруженным в результате синтаксического анализа URL-адреса? Я попытался использовать CloseSpider(), но это не сработало, потому что он полностью закрыл паука до того, как будут проанализированы другие URL-адреса.

Я показываю код, который использую с CloseSpider():

class CmSpider(scrapy.Spider):
    name = "historical"
    start_urls = ['http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=']
    hostname = 'http://www.cmjornal.pt'


    def parse(self, response):
        for i in range(180,200,3):
            url = response.url + str(i)
            yield scrapy.Request(url,callback=self.parse_page,priority = 1)

    def parse_page(self,response):
        if len(response.xpath('/html/body//*')) <= 2:
            raise CloseSpider('bandwidth_exceeded')
        else:
            pass


        articles_url = response.xpath('//*[@class="lead"]/../h3/a/@href').extract()
        for url in articles_url:
            url = self.hostname+url
            item = CmItem()
            item['hostname'] = self.hostname
            request =  scrapy.Request(url,callback=self.parse_article)
            request.meta['item'] = item
            yield request

    def parse_article(self,response):
        item = response.meta['item']

        (...)

Примечание: в этом конкретном случае я знаю, когда закончится контент, но мне нужно запустить это для многих других случаев, когда я не знаю такого ограничения.


person Miguel    schedule 23.11.2017    source источник


Ответы (1)


Вы должны перестать выдавать больше запросов вместо закрытия паука, примерно так:

# -*- coding: utf-8 -*-
import scrapy
from w3lib.url import add_or_replace_parameter
from w3lib.url import url_query_parameter


class HistorialSpider(scrapy.Spider):
    name = 'historial'
    allowed_domains = ['cmjornal.pt']

    def start_requests(self):
        base_url = 'http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent'
        new_url = add_or_replace_parameter(base_url, 'firstContent', 180)
        yield scrapy.Request(new_url, callback=self.parse_page)

    def parse_page(self, response):
        if len(response.xpath('/html/body//*')) <= 2:
           return

        next_page = int(url_query_parameter(response.url, 'firstContent')) + 1
        yield scrapy.Request(add_or_replace_parameter(response.url, 'firstContent', next_page),
                             callback=self.parse_page)


        articles_url = response.xpath('//*[@class="lead"]/../h3/a/@href').extract()
        for url in articles_url:
            yield response.follow(url, callback=self.parse_article)

    def parse_article(self, response):
        pass
person Wilfredo    schedule 23.11.2017