Scrapy正在关闭我的蜘蛛,而一个循环还没有完成

nbnkbykc  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(168)

我正在运行一个非常简单的scrapy循环,在https://api.ipify.org/中连续查询几次

class IpSpider(scrapy.Spider):
    name = "ip"
    n = 0
    use_proxy = True

    def start_requests(self):
        yield scrapy.Request(
            "https://api.ipify.org/", 
            callback=self.parse_ip
        )

    def parse_ip(self, response):
        if self.n < 10:
            self.n += 1
            self.logger.info(self.n)
            self.logger.info(response.body)
            yield scrapy.Request(
                "https://api.ipify.org/", 
                callback=self.parse_ip
            )

我希望它会记录类似于

1
ip
2
ip
3
...

但日志如下所示:

2022-09-01 08:43:38 [ip] INFO: 1
2022-09-01 08:43:38 [ip] INFO: b'ip'
2022-09-01 08:43:38 [scrapy.core.engine] INFO: Closing spider (finished)
2022-09-01 08:43:38 [scrapy.statscollectors] INFO: Dumping Scrapy stats:

请注意,我使用的中间件通过代理路由我的请求。它看起来像:

def process_request(self, request, spider):
    if spider.use_proxy:            
        request.meta['proxy'] = 'proxy_ip:proxy_port'
    return None

为什么scraper会中断for循环?

pbgvytdp

pbgvytdp1#

实际上,这是Scrapy的正常行为,它过滤出重复的请求。
为了允许重复,请求应包括dont_filter=True

yield scrapy.Request(
        "https://api.ipify.org/", 
        callback=self.parse_ip,
        dont_filter=True
    )
uqcuzwp8

uqcuzwp82#

我想你在parser_ip方法中使用了yield命令。这个命令只有在迭代循环调用它时才能工作。在你的代码中,你只调用了parse_ip一次!你需要建立一个for循环。

相关问题