Python Scrapy动态URL循环遍历问题求助
问题:Scrapy中按时间规则自动生成URL并定时请求的实现
我正在编写基于Python和Scrapy的脚本,主体功能已完成,但URL生成和定时请求环节出问题。URL格式为https://mygames.com/{前缀数字}/{后缀数字},更新规则是:
- 每4分钟更新一次,后缀数字+1(比如17:28是
https://mygames.com/6552/4,17:32变为https://mygames.com/6552/5) - 后缀数字到38后,前缀数字+1,后缀重置为0(即
https://mygames.com/6553/0)
尝试了两种嵌套循环代码都无效,无法获取数据,代码如下:
def parse (self, response): l = [1, 2,3,38] l2 = [1,2,3,10000] for x in l: return x for p in l2: return p url = f'https://mygames.com/{p}/{x}' yield scrapy.Request( url = url, callback= self.parse_data, headers= self.headers)
def parse (self , response): l = [1, 2,3,38] l2 = [1,2,3,10000] for x in l: for p in l2: new_url = f'https://mygames.com/{p}/{x}' return new_url yield scrapy.Request( url = new_url, callback= self.parse_data, headers= self.headers)
现有代码的问题
- 两段代码都使用
return,函数执行到return会直接终止,循环仅会返回第一个值,完全无法遍历所有预期的数字组合 - 第一段代码中,
url定义在循环之后,且p、x未被循环正确赋值,逻辑完全错误 - 第二段代码的嵌套循环第一次迭代就触发
return,仅会生成第一个组合的URL,后续循环无法执行,且yield语句在循环外,根本不会被执行到
正确实现思路与代码
要实现按时间间隔生成对应URL并发起请求,需要结合Scrapy的请求调度逻辑,同时正确生成符合规则的URL序列:
1. 核心实现方案
通过解析当前URL的前缀和后缀数字,按规则生成下一个URL,并添加定时延迟后发起新请求,形成循环:
import time import scrapy class MyGamesSpider(scrapy.Spider): name = 'mygames' start_urls = ['https://mygames.com/6552/4'] # 初始URL update_interval = 4 * 60 # 4分钟间隔,单位秒 def parse(self, response): # 先处理当前页面数据 yield scrapy.Request( url=response.url, callback=self.parse_data, headers=self.headers ) # 解析当前URL的前缀和后缀 _, prefix, suffix = response.url.rstrip('/').rsplit('/', 2) prefix = int(prefix) suffix = int(suffix) # 生成下一个URL suffix += 1 if suffix > 38: prefix += 1 suffix = 0 next_url = f'https://mygames.com/{prefix}/{suffix}' # 等待指定时间后发起下一个请求 time.sleep(self.update_interval) yield scrapy.Request( url=next_url, callback=self.parse, headers=self.headers ) def parse_data(self, response): # 这里编写页面数据提取逻辑 pass
2. 额外说明
- 不建议在Scrapy回调中滥用
time.sleep,如果需要更可靠的定时调度,可结合外部工具(如APScheduler)触发爬虫,避免阻塞Scrapy的异步IO - 如果初始URL需要根据当前时间计算,可通过计算起始时间到当前时间的4分钟间隔数,推导对应的前缀和后缀数字
内容的提问来源于stack exchange,提问作者morningstar
相关产品推荐
相关产品推荐

