【发布时间】: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,如:
spider1在spider1_settings.py中的特殊设置:
from settings import *
LOG_FILE = 'spider1.log'
LOG_LEVEL = 'INFO'
JOBDIR = 'spider1-job'
START_URLS = [
'http://test1.com/',
]
spider2在spider2_settings.py中的特殊设置:
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=spider1scrapy crawl spider1
但是这种方式不能用于在scrapyd 中运行蜘蛛。 scrapyd-deploy 命令始终在 scrapy.cfg 'settings' 部分使用 'default' 项目名称来构建 egg file 并将其部署到 scrapyd
有几个问题:
如果我不为每个蜘蛛创建一个项目,这是在一个项目中使用多个蜘蛛的方法吗?有没有更好的办法?
如何分离上面可以在
scrapyd运行的spider的特殊设置并减少源代码冗余如果所有蜘蛛都使用相同的
JOBDIR,那么同时运行所有蜘蛛是否安全?持久化蜘蛛状态是否已损坏?
任何见解都将不胜感激。
【问题讨论】:
-
这似乎是一个很好的方法。您的策略似乎非常易于管理。我不知道如何回答 2。就 3 而言,并发运行它们应该是安全的,除非有一些 3rd 方资源会导致竞争条件。
-
我为此写了一个教程,我们在我们的项目中使用它。 Using multiple spiders in a Scrapy project
-
你找到解决办法了吗?