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

23

我正在使用Scrapy,它非常棒!构建爬虫速度很快。随着网站数量的增加,需要创建新的蜘蛛,但这些网站都是相同类型的,所有这些蜘蛛使用相同的items、pipelines和解析过程。

项目目录的内容:

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中,一个爬虫的特殊设置在[spider name]_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_settings.pyspider2 的特殊设置:

from settings import *

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

Scrapy在启动蜘蛛之前使用LOG_FILELOG_LEVELJOBDIR

START_URLS中的所有URL都填充到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“设置”部分中的 'default' 项目名称来构建一个 egg 文件 并将其部署到 scrapyd

有几个问题:

  1. 如果我不为每个爬虫创建一个项目,是否可以使用多个爬虫在一个项目中?是否存在更好的方法?

  2. 如何分离上述爬虫的特殊设置,以便在 scrapyd 中运行并减少源代码冗余

  3. 如果所有爬虫都使用同一个 JOBDIR,是否安全地同时运行所有爬虫?会不会损坏持久化的爬虫状态?

非常感谢任何见解。


这似乎是一个很好的方法。你的策略看起来非常可行。 我不确定如何回答第二个问题。至于第三个问题,除非存在某些第三方资源会导致竞争条件,否则同时运行它们应该是安全的。 - rocktheartsm4l
1
我写了一个教程,我们在我们的项目中使用它。在Scrapy项目中使用多个爬虫 - user3337861
你找到解决方案了吗? - eLRuLL
3个回答

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文件中的设置,因此您仍然可以设置一些全局设置。

感谢无论是谁在没有解释的情况下对我的回答进行了负评。 - eLRuLL

1

我不知道它是否能回答你的第一个问题,但是我使用多个蜘蛛来使用scrapy,在过去我使用命令

scrapy crawl spider1 

但如果我有多个蜘蛛,这个命令会激活它或其他模块,因此我开始使用这个命令:

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

例子:"scrapy runspider home/Documents/scrapyproject/scrapyproject/spiders/spider1.py"

希望这能帮到您 :)


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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接