Как сказать скрапи, чтобы он остановился для обхода следующей страницы при встрече с пустой страницей?

#python #scrapy #web-crawler

Вопрос:

Я новичок в скрэпи. В принципе, у меня есть несколько веб-страниц с идентичной структурой для обхода. Каждая веб-страница загружается динамически при прокрутке вниз, а запрос ajax выполнен в формате "https://example.org/ajax/unique_id_for_this_page/page=1/...." . При достижении конца страницы что-то в ответе на запрос ajax пусто, поэтому я могу остановиться, чтобы отправить следующий запрос ajax. Как я могу достичь этой цели с помощью scrapy? Вот код, который я использую.

 class WebSpider(Spider):

    base_url = 'https://example.org/ajax/{}/page={}/...'

    def start_requests(self):

        # unique_id for different web pages required to crawl
        unique_ids = ['webpage01', 'webpage02', 'webpage03', ...]

        urls = [base_url.format(unique_id, 1) for unique_id in unique_ids]

        for url in urls:
            # send the 1st page's ajax requests of 3 web pages required to crawl
            yield Requests(url, callback=self.parse)

    def parse(self, response):
        # parse the response and decide if sending the next ajax request
        res = json.loads(response.text)

        if res['data']['list']:
            # the list is not empty, save results and go to next
            save_results_to_item()

            current_page_num = re.search(r'page=(d )', response.url).group(1)
            next_page_num = int(current_page_num)   1

            # generate the next ajax request
            next_page_url = response.url.replace(f'page={current_page_num}', f'page={next_page_num}')

            yield Requests(next_page_url, self.parse)
 

Сможет ли приведенный выше код сканировать все веб-страницы и прекратить отправку новых ajax-запросов для определенной веб-страницы, когда res['data']['list'] она пуста? Мне трудно понять, сработало ли это. Или есть какое-то лучшее решение? Спасибо за любой совет!

Комментарии:

1. По — моему, выглядит неплохо. Кстати, вместо этого вы можете использовать » res = response.json ()».