我正在使用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
中的所有网址都填入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
:
export SCRAPY_PROJECT=spider1
scrapy crawl spider1
但是这种方式不能用于在scrapyd
中运行蜘蛛。 scrapyd-deploy
命令始终在'default'
'设置'中使用scrapy.cfg
项目名称构建egg file
并将其部署到scrapyd
有几个问题:
如果我不为每个蜘蛛创建一个项目,这是在一个项目中使用多个蜘蛛的方法吗?还有更好的方法吗?
如何分离蜘蛛的上述特殊设置,可以在scrapyd
中运行并减少源代码冗余
如果所有蜘蛛使用相同的JOBDIR
,同时运行所有蜘蛛是否安全?持久性蜘蛛状态是否已损坏?
非常感谢任何见解。
答案 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
设置为目标项目。
ENVVAR = 'SCRAPY_SETTINGS_MODULE'
...
def get_project_settings():
if ENVVAR not in os.environ:
project = os.environ.get('SCRAPY_PROJECT', 'default')
init_env(project)