首页 > 解决方案 > 如何将 parse 函数的信息返回给 start_requests 函数?

问题描述

这个问题开始让我非常沮丧,因为我觉得我不知道 scrapy 是如何工作的,而且我无法将我的头脑围绕在文档上。

我的问题很简单。我有最标准的蜘蛛。

class MySpider(scrapy.spider):

    def start_requests(self):
        header = ..
        url = "www.website.whatever/search/filter1=.../&page=1"
        test =  scrapy.Request(url=url, callback=self.parse, headers = header)

    def parse(self, response):
        site_number_of_pages = int(response.xpath(..))
        return site_number_of_pages

我只是想以某种方式将解析函数中的页面数返回到启动请求函数中,这样我就可以启动一个 for 循环来遍历网站上的所有页面,再次使用相同的解析函数。上面的代码仅说明了原理,但如果付诸实践,将无法正常工作。变量test将是一个Request类,而不是我想要的普通 Joe 整数。

我将如何完成我想做的事情?

编辑:这是我到目前为止尝试过的

class MySpider(scrapy.spider):

    def start_requests(self):
        header = ..
        url = ..
        yield scrapy.Request(url=url, callback=self.parse, headers = header)

    def parse(self, response):
        header = ..
        site_number_of_pages = int(response.xpath(..))
        for count in range(2,site_number_of_pages):
            url = url + str(count)
            yield scrapy.Request(url=url, callback=self.parse, headers = header)

标签: pythonpython-3.xweb-scrapingscrapy

解决方案


Scrapy 是异步框架。这里没有任何可能......返回start_urls- 只有请求后跟它的回调。

在一般情况下,如果请求是由于某些响应解析而出现的(在您的情况下 -site_number_of_pages从第一个 url 开始) - 它不是start_requests

在这种情况下,您可以做的最简单的事情是从方法yield请求。parse

    def parse(self, response):
        site_number_of_pages = int(response.xpath(..))
        for i in range(site_number_of_pages):
            ...
            yield Request(url=...

推荐阅读