我正在运行一个非常简单的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循环?
2条答案
按热度按时间pbgvytdp1#
实际上,这是Scrapy的正常行为,它过滤出重复的请求。
为了允许重复,请求应包括
dont_filter=True
uqcuzwp82#
我想你在
parser_ip
方法中使用了yield
命令。这个命令只有在迭代循环调用它时才能工作。在你的代码中,你只调用了parse_ip
一次!你需要建立一个for
循环。