如果我想从start_requests()请求url解析,并且还需要请求切换到下一页,我应该如何组织代码

问题描述 投票:0回答:1

我正在解析一个新闻网站,起点main-url是新闻列表的网页。 我想解析出新闻的每个子url,并请求这些子url来获取相应的html。然后如果 main-url 仍然有下一页,我将请求下一页。这是我的代码:

    def parse(self, response):
        res_json = json.loads(response.text)
        if res_json['code'] == 200:
            news_list = page_info['list']
            next_page_num = page_info['nextPageNum']
            has_next = page_info['hasNext']
            for news in news_list:
                news_url = page_info['shareUrl']
                item['url'] = news_url
                yield response.follow(news_url, headers=self.headers, callback=self.parse_news_html, cb_kwargs=dict(item=item))

            if has_next is True:
                self.body = ('"pageNum":{}').format(next_page_num)
                url = 'https://api.abcd.com/www/newsList/channelNewsList'
                yield scrapy.Request(url=url,
                                     method='POST',
                                     body=self.body,
                                     callback=self.parse)

    def parse_news_html(self, response, item):
        item['page_html'] = response.text
        return item

但是这样,pipeline无法获取到item,main-url也无法切换到下一页。据我所知,解析方法可以返回一个项目,和/或可迭代的请求。但无法返回两个可迭代的请求。那么我应该如何组织我的代码,以便我可以将项目返回到管道并请求下一页。

实际上,我使用requests.get()查询子url并返回item就可以解决问题。我不想依赖requests lib,因为我认为使用scrapy request本身来解决问题更“正式”。这是正确的吗?

scrapy scrapy-shell
1个回答
0
投票

感谢 wRAR 和 Alexander 的帮助。 实际上我没有在settings.py 中配置我的管道。 谢谢你的时间。 最好的, 泾川

© www.soinside.com 2019 - 2024. All rights reserved.