目录在使用 Scrapy 进行 Web 爬取时,可能会碰到这样的需求:你盼望在差别的运行情况下,根据差别的参数执行爬虫任务。比方,爬取差别的页面、调解爬取的时间范围,大概动态地改变某些设置项。为了解决这个题目,Scrapy 提供了通过命令行向爬虫传递参数的方式。 本文将具体先容在 Scrapy 中如何从命令行传递参数,以及如何在爬虫代码中获取这些参数,以加强爬虫的机动性和可设置性。 1. 为什么必要通过命令行传递参数?在很多现实的应用场景中,爬虫的行为可能会随着运行情况的差别而有所变化。比如:
2. 使用 -a 参数传递参数Scrapy 提供了 -a 选项来传递参数,-a 的使用方法非常简单,传递的参数会作为爬虫类的属性,大概传递给 start_requests()、init() 方法。 2.1 基本用法假设你有一个爬虫必要从命令行吸取一个 URL 作为爬取的起始地点,你可以通过 -a 参数传递。 起首,编写一个简单的 Scrapy 爬虫,定义一个吸取 url 参数的爬虫类: [code]import scrapy class 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}") [/code]在这个例子中,url 是从命令行传递进来的参数。如果 url 被指定,那么爬虫会将其作为 start_urls 中的起始 URL。 接下来,通过命令行启动爬虫并传递 url 参数: [code]scrapy crawl myspider -a url=https://example.com [/code]当你运行这个命令时,爬虫将会爬取 https://example.com。 2.2 传递多个参数你还可以通过 -a 传递多个参数。比方,假设你必要传递两个参数 url 和 category,来爬取差别分类的数据: [code]import scrapy class 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 = category def parse(self, response): self.log(f"正在爬取的 URL:{response.url}") self.log(f"分类参数:{self.category}") [/code]运行时可以通过以下命令传递参数: [code]scrapy crawl myspider -a url=https://example.com -a category=books [/code]爬虫会记载爬取的 URL 以及分类参数 category。 2.3 从命令行向 start_requests() 方法传递参数在 Scrapy 中,爬虫类的 init() 方法和 start_requests() 方法是最常见的吸取参数的地方。如果你的参数必要在 start_requests() 中处置惩罚,可以像下面这样使用: [code]import scrapy class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, category=None, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.category = category def 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}") [/code]启动爬虫并传递 category 参数: [code]scrapy crawl myspider -a category=books [/code]爬虫会根据传递的 category 参数动态地构建 URL 并开始爬取。 3. 通过 Scrapy 设置 (settings) 传递参数除了通过 -a 传递参数之外,Scrapy 还允许通过命令行直接修改一些设置项,这些设置项会被传递到爬虫的 settings 中,覆盖默认设置。 3.1 使用 -s 修改 Scrapy 设置-s 选项允许你在命令行中修改 Scrapy 的设置项。比方,你可以通过命令行改变爬虫的 USER_AGENT 大概 DOWNLOAD_DELAY: [code]scrapy crawl myspider -s USER_AGENT="Mozilla/5.0" -s DOWNLOAD_DELAY=2 [/code]在爬虫中,你可以通过 self.settings 获取这些设置: [code]import scrapy class 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}") [/code]3.2 在 settings.py 中使用动态设置有时你可能想根据命令行传递的参数动态修改设置,比方调解并发数大概启用/禁用某个中央件。这可以通过命令行传递设置来实现: [code]scrapy crawl myspider -s CONCURRENT_REQUESTS=10 -s LOG_LEVEL=INFO [/code]这样,CONCURRENT_REQUESTS 会被设置为 10,日志级别被设置为 INFO,覆盖了 settings.py 中的默认值。 4. 通过情况变量传递参数除了 -a 和 -s,你还可以通过情况变量传递参数,特别是在使用容器化部署爬虫时(如 Docker),这种方式很有用。Scrapy 允许你通过 os.environ 获取情况变量,动态修改爬虫的行为。 [code]import scrapy import os class 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}") [/code]在运行时设置情况变量: [code]export TARGET_URL="https://example.com" scrapy crawl myspider [/code]爬虫会根据情况变量 TARGET_URL 动态决定要爬取的 URL。 5. 总结Scrapy 提供了多种方式来从命令行传递参数,使爬虫更具机动性和可设置性。常见的方式包括:
通过这些方式,Scrapy 的爬虫可以轻松顺应各种差别的运行情况和需求,而不必要每次修改代码。这对于必要频仍调解设置大概在生产情况中机动调理爬虫的项目来说,极为紧张。 通过公道使用命令行传递参数,Scrapy 爬虫不但变得更加机动,而且可以轻松集成到各种主动化流程中,如定时任务、CI/CD 管道等。 到此这篇关于Python通过命令行向Scrapy传递参数的文章就先容到这了,更多相干Python Scrapy传递参数内容请搜索脚本之家以前的文章或继承欣赏下面的相干文章盼望各人以后多多支持脚本之家! 来源:https://www.jb51.net/python/3288136d7.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-1 19:33 , Processed in 0.035974 second(s), 19 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.