Как использовать Scrapy для рекурсивной прокрутки страницы новостей с помощью кнопки «Показать больше» - PullRequest
1 голос
/ 15 марта 2020

Я очень новичок в изучении веб-страниц, и у меня есть конкретная проблема c для проекта по общественным наукам. Я пытаюсь отсканировать новостной блог bb c (https://www.bbc.com/news/blogs/the_papers), открыть каждую статью и выполнить поиск слова. Пока что мой паук выглядит так:

class NewsSpider(scrapy.Spider):
name = 'news_spider'

start_urls = ['https://www.bbc.com/news/blogs/the_papers']

data_array = []

def parse(self, response):
    self.logger.info('news blog data:')
    news_blogs = response.css('div.blog__story.story-inner')

    for blog in news_blogs:
        link = blog.css('a::attr(href)').get()
        data_point = blog_parser(link, 'immigration')
        self.logger.info(link)
        self.logger.info(data_point.showData())
        yield {
            'text': blog.css('span.cta::text').get()
        }

Этот скребок работает на первой странице сайта. Моя проблема в том, что мне нужно нажать кнопку «больше историй» в нижней части страницы и рекурсивно очистить новые данные как можно больше раз. Я знаю, что для этого нужно имитировать c запрос, сделанный при нажатии на кнопку

Каждый раз, когда нажимается кнопка «Больше историй», появляется запрос xhr формы: https://www.bbc.com/news/ssi/components.html?batch [blog] [opts] [asset_id] = blogs / the_papers & before = x

Но нет шаблона, который я мог бы рекурсивно повторить, поскольку я имею в виду, что первый параметр x равен 1583453829, следующий - 1582674398 и т. д., без видимого шаблона. Я не смог найти учебник, который учит меня, как справляться с ситуацией такого типа

1 Ответ

0 голосов
/ 29 марта 2020

Если вы ответите на каждый запрос XHR с помощью формы https://www.bbc.com/news/ssi/components.html?batch [blog] [opts] [asset_id] = blogs / the_papers & before = x , вы можете найти элемент в начале ответ:

<div class="blog__stories story-body" id="comp-blog" data-next="/news/ssi/components.html?batch[blog][opts][asset_id]=blogs/the_papers&before=1583796820" >

значение атрибута data-next - это то, что вы хотите сделать в следующем запросе.

...