我正在使用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.py
中 spider2
的特殊设置:
from settings import *
LOG_FILE = 'spider2.log'
LOG_LEVEL = 'DEBUG'
JOBDIR = 'spider2-job'
START_URLS = [
'http://test2.com/',
]
Scrapy
在启动蜘蛛之前使用LOG_FILE
、LOG_LEVEL
和JOBDIR
;
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
:
export SCRAPY_PROJECT=spider1
scrapy crawl spider1
但是这种方式不能用于在 scrapyd
中运行爬虫。 scrapyd-deploy
命令总是使用 scrapy.cfg
“设置”部分中的 'default'
项目名称来构建一个 egg 文件
并将其部署到 scrapyd
。
有几个问题:
如果我不为每个爬虫创建一个项目,是否可以使用多个爬虫在一个项目中?是否存在更好的方法?
如何分离上述爬虫的特殊设置,以便在
scrapyd
中运行并减少源代码冗余如果所有爬虫都使用同一个
JOBDIR
,是否安全地同时运行所有爬虫?会不会损坏持久化的爬虫状态?
非常感谢任何见解。