Как выйти из сканирования, если в Scrapy обнаружены определенные состояния - PullRequest
0 голосов
/ 13 ноября 2018

В целях приложения, над которым я работаю, мне нужно scrap, чтобы прекратить сканирование и начать сканирование с определенного, произвольного URL-адреса.

Предполагаемое поведение для scrap - просто вернуться к определенному URL-адресу, который может быть предоставлен в качестве аргумента, если определенное условие удовлетворено.

Я использую CrawlSpider, но не могу понять, как этого добиться:

class MyCrawlSpider(CrawlSpider):
    name = 'mycrawlspider'
    initial_url = ""

    def __init__(self, initial_url, *args, **kwargs):
        self.initial_url = initial_url
        domain = "mydomain.com"
        self.start_urls = [initial_url]
        self.allowed_domains = [domain]
        self.rules = (
            Rule(LinkExtractor(allow=[r"^http[s]?://(www.)?" + domain + "/.*"]), callback='parse_item', follow=True),
        )

        super(MyCrawlSpider, self)._compile_rules()


    def parse_item(self, response):
        if(some_condition is True):
            # force scrapy to go back to home page and recrawl
            print("Should break out")

        else:
           print("Just carry on")

Я пытался разместить

return scrapy.Request(self.initial_url, callback=self.parse_item)

в ветке someCondition is True, но безуспешно. Был бы очень признателен за помощь, пытаясь понять это часами.

1 Ответ

0 голосов
/ 13 ноября 2018

вы можете сделать пользовательское исключение, которое вы обработаете соответствующим образом, например, так ...

Пожалуйста, не стесняйтесь редактировать с соответствующим синтаксисом для CrawlSpider

class RestartException(Exception):
    pass

class MyCrawlSpider(CrawlSpider):
    name = 'mycrawlspider'
    initial_url = ""

    def __init__(self, initial_url, *args, **kwargs):
        self.initial_url = initial_url
        domain = "mydomain.com"
        self.start_urls = [initial_url]
        self.allowed_domains = [domain]
        self.rules = (
            Rule(LinkExtractor(allow=[r"^http[s]?://(www.)?" + domain + "/.*"]), callback='parse_item', follow=True),
        )

        super(MyCrawlSpider, self)._compile_rules()


    def parse_item(self, response):
        if(some_condition is True):

            print("Should break out")
            raise RestartException("We're restarting now")

        else:
           print("Just carry on")

siteName = "http://whatever.com"
crawler = MyCrawlSpider(siteName)           
while True:
    try:
        #idk how you start this thing, but do that

        crawler.run()
        break
    except RestartException as err:
        print(err.args)
        crawler.something = err.args
        continue

print("I'm done!")
...