何时以及如何在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
里,而某个爬虫的特殊设置则放在 [爬虫名称]_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
中的链接都会填入 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
'settings' 部分中的 'default'
项目名称来构建一个 egg file
并将其部署到 scrapyd
。
有几个问题:
如果我不为每个爬虫创建一个项目,这样在一个项目中使用多个爬虫是对的吗?有没有更好的方法?
如何将爬虫的特殊设置分开,使其可以在
scrapyd
中运行,并减少源代码的重复?如果所有爬虫使用相同的
JOBDIR
,同时运行所有爬虫是否安全?持久化的爬虫状态会被破坏吗?
任何见解都将非常感谢。
3 个回答
干得不错!我在文档中没找到更好的方法来管理多个爬虫。
我对 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)
我不知道这是否能回答你第一个问题,但我用的是scrapy这个工具,里面有多个爬虫。在过去,我使用过这个命令:
scrapy crawl spider1
但是如果我有多个爬虫,这个命令会激活其中一个或其他模块,所以我开始使用这个命令:
scrapy runspider <your full spider1 path with the spiderclass.py>
举个例子:“scrapy runspider home/Documents/scrapyproject/scrapyproject/spiders/spider1.py”
希望这能帮到你 :)
每个爬虫都应该有自己的类,你可以通过 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
文件里的设置,所以你仍然可以设置一些全局的配置。