当前位置: 首页 > news >正文

【Python】如何通过命令行向 Scrapy 传递参数


我听见有人猜
你是敌人潜伏的内线
和你相知多年
我确信对你的了解
你舍命救我画面
一一在眼前浮现
司空见惯了鲜血
你忘记你本是娇娆的红颜
感觉你我彼此都那么依恋
                     🎵 许嵩《内线》


在使用 Scrapy 进行 Web 爬取时,可能会遇到这样的需求:你希望在不同的运行环境下,根据不同的参数执行爬虫任务。例如,爬取不同的页面、调整爬取的时间范围,或者动态地改变某些配置项。为了解决这个问题,Scrapy 提供了通过命令行向爬虫传递参数的方式。

本文将详细介绍在 Scrapy 中如何从命令行传递参数,以及如何在爬虫代码中获取这些参数,以增强爬虫的灵活性和可配置性。

1. 为什么需要通过命令行传递参数?

在很多实际的应用场景中,爬虫的行为可能会随着运行环境的不同而有所变化。比如:

你可能需要从命令行指定要爬取的目标 URL 或者关键词。
你可能希望通过命令行传递起始时间和结束时间,来限定爬取的时间范围。
需要通过参数控制调度的配置,例如延迟、并发数量等。
通过命令行传递参数,能够让你的爬虫更灵活地适应不同的需求,而不必每次都修改代码或配置文件。

2. 使用 -a 参数传递参数

Scrapy 提供了 -a 选项来传递参数,-a 的使用方法非常简单,传递的参数会作为爬虫类的属性,或者传递给 start_requests()、init() 方法。

2.1 基本用法

假设你有一个爬虫需要从命令行接收一个 URL 作为爬取的起始地址,你可以通过 -a 参数传递。

首先,编写一个简单的 Scrapy 爬虫,定义一个接收 url 参数的爬虫类:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def __init__(self, url=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.start_urls = [url] if url else []def parse(self, response):self.log(f"正在爬取的 URL:{response.url}")

在这个例子中,url 是从命令行传递进来的参数。如果 url 被指定,那么爬虫会将其作为 start_urls 中的起始 URL。

接下来,通过命令行启动爬虫并传递 url 参数:

scrapy crawl myspider -a url=https://example.com

当你运行这个命令时,爬虫将会爬取 https://example.com。

2.2 传递多个参数

你还可以通过 -a 传递多个参数。例如,假设你需要传递两个参数 url 和 category,来爬取不同分类的数据:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def __init__(self, url=None, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.start_urls = [url] if url else []self.category = categorydef parse(self, response):self.log(f"正在爬取的 URL:{response.url}")self.log(f"分类参数:{self.category}")

运行时可以通过以下命令传递参数:

scrapy crawl myspider -a url=https://example.com -a category=books

爬虫会记录爬取的 URL 以及分类参数 category。

2.3 从命令行向 start_requests() 方法传递参数

在 Scrapy 中,爬虫类的 init() 方法和 start_requests() 方法是最常见的接收参数的地方。如果你的参数需要在 start_requests() 中处理,可以像下面这样使用:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def __init__(self, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.category = categorydef start_requests(self):urls = ['https://example.com/category1','https://example.com/category2']for url in urls:if self.category:url += f'?category={self.category}'yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):self.log(f"正在爬取:{response.url}")

启动爬虫并传递 category 参数:

scrapy crawl myspider -a category=books

爬虫会根据传递的 category 参数动态地构建 URL 并开始爬取。

3. 通过 Scrapy 设置 (settings) 传递参数

除了通过 -a 传递参数之外,Scrapy 还允许通过命令行直接修改一些配置项,这些配置项会被传递到爬虫的 settings 中,覆盖默认配置。

3.1 使用 -s 修改 Scrapy 设置

-s 选项允许你在命令行中修改 Scrapy 的设置项。例如,你可以通过命令行改变爬虫的 USER_AGENT 或者 DOWNLOAD_DELAY:

scrapy crawl myspider -s USER_AGENT="Mozilla/5.0" -s DOWNLOAD_DELAY=2

在爬虫中,你可以通过 self.settings 获取这些设置:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):user_agent = self.settings.get('USER_AGENT')delay = self.settings.get('DOWNLOAD_DELAY')self.log(f"User Agent: {user_agent}, 下载延迟: {delay}")
3.2 在 settings.py 中使用动态配置

有时你可能想根据命令行传递的参数动态修改配置,例如调整并发数或者启用/禁用某个中间件。这可以通过命令行传递配置来实现:

scrapy crawl myspider -s CONCURRENT_REQUESTS=10 -s LOG_LEVEL=INFO

这样,CONCURRENT_REQUESTS 会被设置为 10,日志级别被设置为 INFO,覆盖了 settings.py 中的默认值。

4. 通过环境变量传递参数

除了 -a 和 -s,你还可以通过环境变量传递参数,特别是在使用容器化部署爬虫时(如 Docker),这种方式很有用。Scrapy 允许你通过 os.environ 获取环境变量,动态修改爬虫的行为。

import scrapy
import osclass MySpider(scrapy.Spider):name = 'myspider'def start_requests(self):url = os.getenv('TARGET_URL', 'https://example.com')yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):self.log(f"爬取 URL:{response.url}")

在运行时设置环境变量:

export TARGET_URL="https://example.com"
scrapy crawl myspider

爬虫会根据环境变量 TARGET_URL 动态决定要爬取的 URL。

5. 总结

Scrapy 提供了多种方式来从命令行传递参数,使爬虫更具灵活性和可配置性。常见的方式包括:

使用 -a 参数将数据直接传递给爬虫类或 start_requests() 方法,用于动态指定爬取内容。
使用 -s 参数直接修改 Scrapy 的设置项,如并发数、下载延迟等配置。
通过环境变量来传递参数,特别适用于容器化部署场景。
通过这些方式,Scrapy 的爬虫可以轻松适应各种不同的运行环境和需求,而不需要每次修改代码。这对于需要频繁调整配置或者在生产环境中灵活调度爬虫的项目来说,极为重要。

通过合理使用命令行传递参数,Scrapy 爬虫不仅变得更加灵活,而且可以轻松集成到各种自动化流程中,如定时任务、CI/CD 管道等。


http://www.mrgr.cn/news/541.html

相关文章:

  • 建筑工程项目管理系统-计算机毕设Java|springboot实战项目
  • Redis 集群三主三从配置
  • Shell脚本发送邮件的详细步骤与配置方法?
  • 长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
  • 打破接口壁垒:适配器模式让系统无缝对接
  • AVI-Talking——能通过语音生成很自然的 3D 说话面孔
  • android13禁用打开wifi ap 热点
  • list使用及底层模拟实现
  • 海康VisionMaster使用学习笔记5-开机自启动
  • GORM 模型定义及代码示例
  • 线程的概念
  • 《学会 SpringBoot 系列 · spring.factories 详解》
  • WEB漏洞-SQL注入之简要SQL注入
  • HTTPS 详解
  • 看图学sql之sql 中的窗口函数
  • 融合创新:EasyCVR视频汇聚平台云计算技术与AI技术共筑雪亮工程智能防线
  • RabbitMQ发布订阅模式Publish/Subscribe详解
  • 了解Android
  • 客户端登录逻辑
  • WLAN射频调优