何时以及如何在一个棘手的项目中使用多个蜘蛛

2024-09-29 19:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用^ {CD1}},太棒了!这么快就造了一个爬虫。随着网站数量的增加,需要创建新的蜘蛛,但这些网站都是同一类型的, 所有这些蜘蛛使用相同的项目、管道、解析过程

项目目录的内容:

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有一个基本spider MyBaseSpider,95%的源代码都在其中,所有其他spider都继承自它,如果spider有一些特殊的东西,重写一些 class methods,通常只需要添加几行源代码就可以创建一个新的spider

将所有常用设置放在settings.py中,一个蜘蛛的特殊设置在[spider name]_settings.py中,例如:

spider1_settings.pyspider1的特殊设置:

^{pr2}$

spider2_settings.pyspider2的特殊设置:

from settings import *

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

Scrapy在启动spider之前使用LOG_FILELOG_LEVELJOBDIR

START_URLS中的所有url都填充到MyBaseSpider.start_urls中,不同的spider有不同的内容,但基本spider MyBaseSpider中使用的名称START_URLS没有改变。在

scrapy.cfg的内容:

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

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

要运行spider,例如spider1,请执行以下操作:

  1. export SCRAPY_PROJECT=spider1

  2. scrapy crawl spider1

但是这种方式不能用于在scrapyd中运行蜘蛛。scrapyd-deploy命令总是在scrapy.cfg“设置”部分中使用'default'项目名来构建egg file,并将其部署到scrapyd

有几个问题:

  1. 如果我不为每个spider创建一个项目,这是在一个项目中使用多个spider的方式吗?有更好的办法吗?

  2. 如何分离spider的特殊设置(如上所述),这些设置可以在scrapyd中运行,并减少源代码冗余

  3. 如果所有spider使用相同的JOBDIR,那么并发运行所有spider是否安全?持久蜘蛛状态是否已损坏?

任何见解都将不胜感激。在


Tags: 项目pytestlog内容settings源代码cfg
3条回答

由于所有spider都应该有自己的类,因此可以使用custom_settingsclass参数设置每个spider的设置,如下所示:

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

干得好!我在文档中没有找到更好的方法来管理多个spider。在

我不知道scrapyd。{1>时,您应该在环境变量^中运行。在

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)

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

scrapy crawl spider1 

但如果我有一个以上的蜘蛛,这个命令激活它或其他模块,所以我开始使用这个命令:

^{pr2}$

示例:“scrapy runspider home/Documents/scrapyproject/scrapyproject/spider1.py”

我希望这会有帮助:)

相关问题 更多 >

    热门问题