Scrapy-如何在使用脚本启动Spider时加载项目级别的settings.py

时间:2018-10-31 09:21:58

标签: python scrapy scrapy-spider

我正在尝试实现一个抓爬网,该爬网使用以下代码的脚本开始。

let id =parseInt(this.state.tbl);

fetch(`http://192.168.254.100:3308/OrdName/ordName/${id}`)
.then((response) => response.json())
.then((responseData) => {
    this.setState({ menu_name: responseData })
})

因此,使用CrawlerRunner在执行蜘蛛程序时不会收到项目级别的settings.py配置。通用抓取工具接受三个参数,其中一个是起始网址列表。

除了在蜘蛛网中设置custom_settings之外,如何将settings.py加载到CrawlerRunner进程中?

1 个答案:

答案 0 :(得分:2)

即使我的情况与您的情况并非100%相同,我也将尽力回答这个问题,但是,我遇到了类似的问题。

典型的scrapy项目结构如下:

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

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

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

[settings]
default: your_project.settings

[deploy]
...

运行要调用Spider的主脚本以一组特定的设置运行时,应将main.py脚本与scrapy.cfg文件放在同一目录中。

现在从main.py开始,您的代码将必须创建一个 CrawlerProcess CrawlerRunner 实例来运行蜘蛛,可以使用设置对象或字典,如下所示:

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项目,其中包含多个共享许多相似设置的蜘蛛。因此,我有一个 global_settings.py 文件,然后每个蜘蛛中都包含特定的设置。由于共享设置的数量众多,我喜欢将所有内容保持整洁的想法放在一个文件中,而不是复制和粘贴代码。

经过大量研究后,我发现最简单的方法是使用 get_project_settings()函数实例化 CrawlerProcess / Runner 对象,发现 get_project_settings 使用scrapy.cfg [设置] 下的 默认 值来找到项目具体设置。

因此,对于您的项目,请确保scrapy.cfg 设置默认值 的值在您调用 get_project_settings( )

我还要补充一点,如果您有多个用于多个scrapy项目的设置文件,并且想要共享根目录,则可以将其添加到scrapy.cfg中,如下所示:

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

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

正如我之前说过的那样,对现成的 get_project_settings()调用将从scrapy.cfg文件中为蜘蛛加载 default 值的设置文件( your_project.settings (在上面的示例中),但是,如果要在同一过程中更改用于下一个蜘蛛运行的设置,则可以修改为要启动的蜘蛛加载的设置。

这有点棘手和“ hackey”,但对我有用...

在第一次调用 get_project_settings()之后,将设置一个名为 SCRAPY_SETTINGS_MODULE 的环境变量。此环境变量值将设置为scrapy.cfg文件中您的 default 值。要更改在创建的流程实例(CrawlerRunner / Process-> process.crawl('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

这一切都可以通过主脚本来完成,以操纵蜘蛛及其设置。就像我之前说过的那样,我发现只拥有具有所有共同点的全局设置文件,然后在蜘蛛本身中设置蜘蛛特定设置就容易了。通常这要清楚得多。

Scrapy文档有点粗糙,希望这对某人有帮助...