【问题标题】:When and how should use multiple spiders in one Scrapy project何时以及如何在一个 Scrapy 项目中使用多个蜘蛛
【发布时间】:2014-09-24 03:58:43
【问题描述】:

我正在使用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中的所有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 'settings' 部分使用 'default' 项目名称来构建 egg file 并将其部署到 scrapyd

有几个问题:

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

  2. 如何分离上面可以在scrapyd运行的spider的特殊设置并减少源代码冗余

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

任何见解都将不胜感激。

【问题讨论】:

  • 这似乎是一个很好的方法。您的策略似乎非常易于管理。我不知道如何回答 2。就 3 而言,并发运行它们应该是安全的,除非有一些 3rd 方资源会导致竞争条件。
  • 我为此写了一个教程,我们在我们的项目中使用它。 Using multiple spiders in a Scrapy project
  • 你找到解决办法了吗?

标签: python scrapy


【解决方案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)

【讨论】:

    【解决方案2】:

    由于所有蜘蛛都应该有自己的类,您可以使用 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 文件中的那些,所以你仍然可以设置一些全局的。

    【讨论】:

    • 感谢谁在没有解释的情况下否决了我的答案。
    【解决方案3】:

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

    scrapy crawl spider1 
    

    但是如果我有不止一个蜘蛛,这个命令会激活它或另一个模块,所以我开始使用这个命令:

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

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

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2013-08-05
      相关资源
      最近更新 更多