如何加载项目级别设置.py使用脚本启动spid时

2024-06-16 13:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个垃圾蜘蛛,这是开始使用脚本如下代码。在

from scrapy.crawler import CrawlerRunner 
from scrapy_app.scrapy_app.spiders.generic import GenericSpider
....

class MyProcess(object):

    def start_my_process(self, _config, _req_obj, site_urls):
        runner = CrawlerRunner()       
        runner.crawl(GenericSpider, 
                config=_config, 
                reqObj=_req_obj,
                urls=site_urls)
        deferred = runner.join()
        deferred.addBoth(lambda _: reactor.stop())
        reactor.run()

    ....

所以,使用crawlarrunner,我没有收到项目级别设置.py执行spider时的配置。通用spider接受三个参数,其中一个是起始url的列表。在

我们如何加载设置.py对CrawlerRunner进程执行的操作,而不是在spider中设置自定义的\u设置?在


Tags: fromimportconfigobjappsiteurlsreq
1条回答
网友
1楼 · 发布于 2024-06-16 13:54:51

我会尽力回答这个问题,尽管我的情况和你的不完全一样,但是,我也有类似的问题。在

典型的垃圾项目结构如下所示:

scrapy.cfg
myproject/
    __init__.py
    items.py
    middlewares.py
    pipelines.py
    settings.py
    spiders/
        __init__.py
        spider1.py
        spider2.py
        ...

包含scrapy.cfg文件的目录被视为项目的根目录。在

在该文件中,您将看到如下内容:

^{pr2}$

当运行调用spider以使用特定设置集运行的主脚本时,main.py脚本应该与scrapy.cfg文件位于同一目录中。在

现在,从main.py开始,您的代码将必须创建一个CrawlerProcessCrawlerRunner实例来运行spider,该实例可以用settings对象或dict进行实例化,如下所示:

process = CrawlerProcess(settings={
    'FEED_FORMAT': 'json',
    'FEED_URI': 'items.json'
}) 

                   -

from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

dict场景可以工作,但是很麻烦,因此get_project_settings()调用可能会引起更大的兴趣,我将对此进行扩展。在

我有一个大型的scrapy项目,其中包含多个共享大量类似设置的spider。所以我有一个_设置.py文件,然后是每个spider中包含的特定设置。由于有大量的共享设置,我喜欢在一个文件中保持所有内容整洁,而不是复制和粘贴代码的想法。在

经过大量的研究,我发现最简单的方法是用get_project_settings()函数实例化CrawlerProcess/Runner对象,关键在于获取项目设置使用{}中[settings]下的默认值查找特定于项目的设置。在

因此,在调用get\u project\u settings()时,确保项目的^{设置默认值指向所需的设置文件。在

我还将添加,如果您有多个scrapy项目的多个设置文件,并且希望共享根目录,您可以将这些文件添加到scrapy.cfg中,如下所示:

[settings]
default = your_project.settings
project1 = myproject1.settings
project2 = myproject2.settings

将所有这些设置添加到根目录配置文件将允许您在脚本中随意切换设置。在

正如我之前所说,对get_project_settings()的现成调用将从scrapy.cfg文件(您的_项目.设置但是,如果要更改同一进程中下一个spider运行所使用的设置,则可以修改为要启动的蜘蛛加载的设置。在

这有点棘手和“骇客”,但它对我有效。。。在

在第一次调用get_project_settings()之后,将设置一个名为SCRAPY_settings_MODULE的环境变量。此环境变量值将设置为scrapy.cfg文件中的默认值。更改用于在创建的流程实例中运行的后续蜘蛛的设置(crawlarrunner/process>;进程.爬网('next_spider_to_start')),此变量将需要被操作。在

要在当前流程实例上设置一个新的设置模块,该流程实例以前已用该模块实例化了get_project_settings():

import os    

# Clear the old settings module
del os.environ['SCRAPY_SETTINGS_MODULE']

# Set the project environment variable (new set of settings), this should be a value in your scrapy.cfg
os.environ['SCRAPY_PROJECT'] = 'project2'

# Call get_project_settings again and set to process object
process.settings = get_project_settings()

# Run the next crawler with the updated settings module
process.crawl('next_spider_to_start')

get_project_settings()刚刚为您的爬虫进程实例将当前进程设置(Twisted Reactor)更新为myproject2.settings。在

所有这些都可以通过主脚本来操作蜘蛛及其设置。正如我之前所说的,我发现只需要一个包含所有共性的全局设置文件,然后在spider中设置特定于spider的设置会更容易。这通常要清楚得多。在

刮痧医生有点粗糙,希望这能帮助某人。。。在

相关问题 更多 >