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

如何向Scrapy传递start_urls参数及出现Missing scheme报错的问题

报错原因

Scrapy 通过 -a 参数传递的所有值默认都会解析为字符串类型,不会自动转换为列表。而 Scrapy 原生 Spider 的 start_requests 逻辑会遍历 start_urls 属性逐个生成请求,当你把本应为列表类型的 start_urls 赋值为单个 URL 字符串时,遍历逻辑会把字符串拆分为单个字符处理,第一个字符h不符合URL格式要求、缺少http/https协议头,因此抛出Missing scheme in request url报错。

正确传递自定义起始URL的方法

方案1:改造Spider初始化逻辑适配传参

修改生成的 Spider 文件,对传入的字符串格式的URL做列表转换即可,代码示例:

import scrapy

class Spider1Spider(scrapy.Spider):
    name = 'spider1'
    allowed_domains = ['stackoverflow.com']
    # 可保留默认start_urls作为缺省值
    start_urls = ['https://stackoverflow.com/']

    def __init__(self, start_urls=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if start_urls:
            # 多个URL可以用逗号分隔,此处按逗号拆分转为列表
            self.start_urls = start_urls.split(',')

改造完成后即可正常通过命令传参,单URL调用示例:

scrapy crawl spider1 -a start_urls="https://stackoverflow.com"

多URL调用示例:

scrapy crawl spider1 -a start_urls="https://stackoverflow.com/questions,https://stackoverflow.com/tags"

方案2:重写start_requests方法直接读取参数

如果不想修改初始化逻辑,也可以换个参数名避开和原生start_urls属性冲突,直接重写请求生成逻辑:

import scrapy

class Spider1Spider(scrapy.Spider):
    name = 'spider1'
    allowed_domains = ['stackoverflow.com']

    def start_requests(self):
        # 直接读取命令行传入的custom_start_url参数发起请求
        yield scrapy.Request(self.custom_start_url)

对应调用命令:

scrapy crawl spider1 -a custom_start_url="https://stackoverflow.com"

内容的提问来源于stack exchange,提问作者watch-this

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:18:04