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

时间:2014-08-01 02:19:18

标签: python scrapy

我正在使用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中,一个蜘蛛的特殊设置位于[spider name]_settings.py,例如:

spider1spider1_settings.py的特殊设置:

from settings import *

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

spider2spider2_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,不同的蜘蛛有不同的内容,但基础蜘蛛START_URLS中使用的名称MyBaseSpider未被更改

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

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

    的部分

    有几个问题:

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

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

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

    4. 非常感谢任何见解。

3 个答案:

答案 0 :(得分:1)

As all spiders should have their own class, you could set the settings per spider with the custom_settings class argument, so something like:

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'}

this custom_settings will overwrite the ones on the settings.py file so you could still set some global ones.

答案 1 :(得分:0)

我不知道它是否会回答您的第一个问题,但我使用scrapy与多个蜘蛛,过去我使用命令

scrapy crawl spider1 

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

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

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

我希望它会有所帮助:)

答案 2 :(得分:0)

干得好!在文档中找不到更好的方法来管理多个蜘蛛。

我不知道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)