You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:16:10