如何向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
相关产品推荐
相关产品推荐

