Scrapy-如何在没有“下一步”按钮的情况下管理分页?

时间:2019-12-22 16:50:40

标签: python web-scraping scrapy

我正在从this之类的网站上抓取文章的内容,该网站上没有“下一步”按钮。 ItemLoader是从parse_issue对象中的response.meta以及一些其他数据(如section_name)传递的。这是函数:

     def parse_article(self, response):
        self.logger.info('Parse function called parse_article on {}'.format(response.url))
        acrobat = response.xpath('//div[@class="txt__lead"]/p[contains(text(), "Plik do pobrania w wersji (pdf) - wymagany Acrobat Reader")]')
        limiter = response.xpath('//p[@class="limiter"]')
        if not acrobat and not limiter:
            loader = ItemLoader(item=response.meta['periodical_item'].copy(), response=response)
            loader.add_value('section_name', response.meta['section_name'])
            loader.add_value('article_url', response.url)
            loader.add_xpath('article_authors', './/p[@class="l doc-author"]/b')
            loader.add_xpath('article_title', '//div[@class="cf txt "]//h1')
            loader.add_xpath('article_intro', '//div[@class="txt__lead"]//p')
            article_content = response.xpath('.//div[@class=" txt__rich-area"]//p').getall()
            # # check for pagiantion
            next_page_url = response.xpath('//span[@class="pgr_nrs"]/span[contains(text(), 1)]/following-sibling::a[1]/@href').get()
            if next_page_url:
                # I'm not sure what should be here... Something like this: (???)
                yield response.follow(next_page_url, callback=self.parse_article, meta={
                'periodical_item' : loader.load_item(),
                'article_content' : article_content
                })
            else:
                loader.add_xpath('article_content', article_content)
                yield loader.load_item()

问题出在parse_article函数中:我不知道如何将所有页面的段落内容组合到一个项目中。有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您的parse_article看起来不错。如果问题只是将article_content添加到加载程序中,则只需要从response.meta获取它即可:

我将更新此行:

article_content = response.meta.get('article_content', '') + response.xpath('.//div[@class=" txt__rich-area"]//p').getall()

答案 1 :(得分:0)

只需将下一页URL设置为迭代X数量即可。

我注意到该文章有4页,但有些可能会更多

只需在网址末尾添加/ 2或/ 3即可区分它们,例如

https://www.gosc.pl/doc/791526.Zaloz-zbroje/
https://www.gosc.pl/doc/791526.Zaloz-zbroje/2
https://www.gosc.pl/doc/791526.Zaloz-zbroje/3

我不要用沙皮。但是当我需要多个页面时,通常只需要迭代即可。

首次抓取页面时。首先找到该文章的最大页面数。例如,在该网站上,它说1/4,所以您总共需要4页。

url = "https://www.gosc.pl/doc/791526.Zaloz-zbroje/"
data_store = ""
for i in range(1, 5):
    actual_url = "{}{}".format(url, I)
    scrape_stuff = content_you_want
    data_store += scrape_stuff

# format the collected data