何时以及如何在Scrapy项目中使用多个爬虫

23 投票
3 回答
8251 浏览
提问于 2025-04-18 15:35

我正在使用 Scrapy,它真不错!构建爬虫的速度非常快。随着网站数量的增加,我需要创建新的爬虫,但这些网站都是同类型的,所有这些爬虫使用相同的项目、管道和解析过程。

项目目录的内容如下:

test/
├── scrapy.cfg
└── test
    ├── __init__.py
    ├── items.py
    ├── mybasespider.py
    ├── pipelines.py
    ├── settings.py
    ├── spider1_settings.py
    ├── spider2_settings.py
    └── spiders
        ├── __init__.py
        ├── spider1.py
        └── spider2.py

为了减少源代码的重复,mybasespider.py 里有一个基础爬虫 MyBaseSpider,95%的源代码都在里面,其他爬虫都从它那里继承。如果某个爬虫有特殊需求,可以重写一些 class methods,通常只需要添加几行代码就能创建一个新的爬虫。

把所有通用的设置放在 settings.py 里,而某个爬虫的特殊设置则放在 [爬虫名称]_settings.py 中,比如:

spider1 的特殊设置在 spider1_settings.py 中:

from settings import *

LOG_FILE = 'spider1.log'
LOG_LEVEL = 'INFO'
JOBDIR = 'spider1-job'
START_URLS = [
    'http://test1.com/',
]

spider2 的特殊设置在 spider2_settings.py 中:

from settings import *

LOG_FILE = 'spider2.log'
LOG_LEVEL = 'DEBUG'
JOBDIR = 'spider2-job'
START_URLS = [
    'http://test2.com/',
]

Scrapy 在启动爬虫之前会使用 LOG_FILELOG_LEVELJOBDIR

所有在 START_URLS 中的链接都会填入 MyBaseSpider.start_urls,不同的爬虫内容不同,但基础爬虫 MyBaseSpider 中的 START_URLS 名称是不会改变的。

scrapy.cfg 的内容如下:

[settings]
default = test.settings
spider1 = spider1.settings
spider2 = spider2.settings

[deploy]
url = http://localhost:6800/
project = test

要运行一个爬虫,比如 spider1

  1. export SCRAPY_PROJECT=spider1

  2. scrapy crawl spider1

但是这种方式不能在 scrapyd 中运行爬虫。scrapyd-deploy 命令总是使用 scrapy.cfg 'settings' 部分中的 'default' 项目名称来构建一个 egg file 并将其部署到 scrapyd

有几个问题:

  1. 如果我不为每个爬虫创建一个项目,这样在一个项目中使用多个爬虫是对的吗?有没有更好的方法?

  2. 如何将爬虫的特殊设置分开,使其可以在 scrapyd 中运行,并减少源代码的重复?

  3. 如果所有爬虫使用相同的 JOBDIR,同时运行所有爬虫是否安全?持久化的爬虫状态会被破坏吗?

任何见解都将非常感谢。

3 个回答

1

干得不错!我在文档中没找到更好的方法来管理多个爬虫。

我对 scrapyd 不了解。不过当你从命令行运行时,应该把环境变量 SCRAPY_PROJECT 设置为你要操作的项目。

可以查看 scrapy/utils/project.py 这个链接。

ENVVAR = 'SCRAPY_SETTINGS_MODULE'

...

def get_project_settings():
    if ENVVAR not in os.environ:
        project = os.environ.get('SCRAPY_PROJECT', 'default')
        init_env(project)
1

我不知道这是否能回答你第一个问题,但我用的是scrapy这个工具,里面有多个爬虫。在过去,我使用过这个命令:

scrapy crawl spider1 

但是如果我有多个爬虫,这个命令会激活其中一个或其他模块,所以我开始使用这个命令:

scrapy runspider <your full spider1 path with the spiderclass.py> 

举个例子:“scrapy runspider home/Documents/scrapyproject/scrapyproject/spiders/spider1.py”

希望这能帮到你 :)

3

每个爬虫都应该有自己的类,你可以通过 custom_settings 这个类参数为每个爬虫设置不同的配置,像这样:

Class MySpider1(Spider):
    name = "spider1"
    custom_settings = {'USER_AGENT': 'user_agent_for_spider1/version1'}

Class MySpider1(Spider):
    name = "spider1"
    custom_settings = {'USER_AGENT': 'user_agent_for_spider2/version2'}

这个 custom_settings 会覆盖 settings.py 文件里的设置,所以你仍然可以设置一些全局的配置。

撰写回答