Python 网络爬虫:深入解析 Scrapy

        大家好,在当今数字化时代,获取和分析网络数据是许多项目的关键步骤。从市场竞争情报到学术研究,网络数据的重要性越来越被人们所认识和重视。然而,手动获取和处理大量的网络数据是一项繁琐且耗时的任务。幸运的是,Python 的 Scrapy 框架为我们提供了一种强大且高效的解决方案。

        Scrapy 是一个基于 Python 的开源网络爬虫框架,它能够帮助我们快速、高效地抓取和处理网络数据。无论是抓取网页内容、提取结构化数据还是进行数据清洗和分析,Scrapy 都是一种强大的工具。在接下来的内容中,我们将深入探讨 Scrapy 的各个方面,从安装和快速入门开始,逐步介绍其核心组件和高级功能。我们将探讨如何编写 Spider 来定义抓取规则,如何定义 Item 来提取数据,以及如何编写 Pipeline 来处理爬取到的数据。此外,我们还将介绍一些高级用法,如异步处理、用户代理和IP代理、分布式爬取等。

一、介绍

1、什么是 Scrapy?

        Scrapy 是一个基于 Python 的高级网络爬虫框架,用于快速、高效地抓取和处理网页数据。它提供了强大的功能和灵活的架构,使得开发者能够轻松构建和部署自己的网络爬虫。Scrapy 被广泛应用于数据挖掘、搜索引擎、市场分析、学术研究等领域。

2、Scrapy 的主要特点

Scrapy 框架具有许多强大的特点,使其成为首选的网络爬虫工具:

  • 高效性:Scrapy 采用异步处理和多线程机制,能够快速高效地抓取大量网页数据。
  • 灵活性:Scrapy 提供了丰富的配置选项和可扩展的架构,开发者可以根据自己的需求定制和扩展爬虫功能。
  • 智能调度:Scrapy 能够智能调度和管理爬取任务,支持优先级调度、并发控制、下载延迟等策略,确保爬虫的稳定性和效率。
  • 强大的选择器:Scrapy 提供了强大的选择器工具,如 XPath 和 CSS 选择器,方便开发者快速提取目标数据。
  • 数据处理管道:Scrapy 提供了数据处理管道机制,可以方便地对爬取到的数据进行处理、过滤和存储。
  • 分布式支持:Scrapy 支持分布式爬取,可以通过分布式架构提高爬虫的性能和稳定性。

3、安装方法和环境要求

(1)安装方法

Scrapy 可以通过 pip 工具进行安装。在命令行中执行以下命令即可安装最新版本的 Scrapy:

pip install scrapy

(2)环境要求

为了正常安装和运行 Scrapy,需要满足以下环境要求:

  • Python 版本:Scrapy 支持 Python 3.5 及以上版本。
  • 操作系统:Scrapy 可以在 Windows、Linux 和 macOS 等操作系统上运行。
  • 其他依赖:Scrapy 还依赖于一些第三方库,如 Twisted、lxml、pyOpenSSL 等。在安装 Scrapy 时,这些依赖会自动安装。

安装完成后,就可以开始使用 Scrapy 来开发自己的网络爬虫了。

二、快速入门

        在这一部分,将介绍如何快速入门 Scrapy,并通过简单的示例演示如何创建一个新的 Scrapy 项目、编写爬虫 Spider,并运行爬虫来获取网页数据。

1、创建一个新的 Scrapy 项目

        要创建一个新的 Scrapy 项目,可以使用命令行工具 scrapy 提供的 startproject 命令。假设我们要创建一个名为 myproject 的项目,执行以下命令:

scrapy startproject myproject

这将在当前目录下创建一个名为 myproject 的文件夹,其中包含了 Scrapy 项目的基本结构:

myproject/scrapy.cfgmyproject/__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyspiders/__init__.py
  • scrapy.cfg:Scrapy 项目的配置文件。
  • myproject/:Scrapy 项目的 Python 包。
  • items.py:定义爬取的数据模型。
  • middlewares.py:定义中间件。
  • pipelines.py:定义数据处理管道。
  • settings.py:Scrapy 项目的设置文件。
  • spiders/:存放爬虫 Spider 的目录。

2、编写爬虫 Spider

        在 spiders/ 目录下,可以创建一个新的 Python 文件来编写爬虫 Spider。假设我们要编写一个简单的 Spider 来抓取某个网站的标题和链接,创建一个名为 example.py 的文件,内容如下:

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['http://example.com']def parse(self, response):for article in response.css('article'):yield {'title': article.css('h2::text').get(),'link': article.css('a::attr(href)').get(),}

        在这个示例中,我们定义了一个名为 ExampleSpider 的 Spider,指定了它的名称为 'example',并指定了起始 URL 为 'http://example.com'。在 parse 方法中,我们使用 CSS 选择器提取了页面中所有的文章标题和链接,并使用 yield 返回抓取到的数据。

3、运行爬虫并查看结果

        要运行刚刚编写的 Spider,可以使用命令行工具 scrapy 提供的 crawl 命令。在项目根目录下执行以下命令:

cd myproject
scrapy crawl example

        这将会启动名为 'example' 的 Spider,并开始抓取数据。抓取完成后,爬取到的数据会默认打印到控制台上。也可以将数据保存到文件或者数据库中,具体可以在 Spider 中自行定义。

三、Scrapy 核心组件

        Scrapy 框架包含了多个核心组件,它们协同工作来完成网络爬虫的各个阶段任务。下面我们将逐一介绍这些核心组件及其用法:

1、Spider

(1)作用和用法:

        Spider 是 Scrapy 框架中最重要的组件之一,用于定义爬虫的行为和抓取规则。每个 Spider 负责从网页中提取数据,并将数据封装为 Item 对象。Spider 需要实现一个或多个爬取网页的方法,通常名为 parse

(2)编写 Spider 的步骤

编写 Spider 的步骤如下:

  1. 创建一个 Spider 类,继承自 scrapy.Spider
  2. 在 Spider 类中定义 name 属性,指定 Spider 的名称。
  3. 在 Spider 类中定义 start_urls 属性,指定起始 URL。
  4. 在 Spider 类中实现 parse 方法,用于解析网页内容并提取数据。

(3)示例

下面是一个简单的示例,展示了如何编写一个 Spider 来抓取网页的标题和链接:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'start_urls = ['http://example.com']def parse(self, response):# 提取网页中的标题和链接for article in response.css('article'):yield {'title': article.css('h2::text').get(),'link': article.css('a::attr(href)').get(),}

        在这个示例中,我们创建了一个名为 MySpider 的 Spider 类,指定了它的名称为 'myspider',并指定了起始 URL 为 'http://example.com'。在 parse 方法中,我们使用 CSS 选择器提取了页面中所有的文章标题和链接,并使用 yield 返回抓取到的数据。 

2、Item

(1)作用和用法:

        Item 是用来定义爬取到的数据的容器,类似于字典。通过定义 Item 类型,可以明确数据的结构,便于后续处理和存储。在 Spider 中提取到的数据可以封装为 Item 对象,然后交给 Pipeline 进行处理。

(2)定义 Item 的步骤

定义 Item 的步骤如下:

  1. 创建一个类,继承自 scrapy.Item
  2. 在类中定义数据字段,字段类型可以是 scrapy.Field 或其子类。

(3)示例

下面是一个简单的示例,展示了如何定义一个 Item 类来存储网页中的标题和链接:

import scrapyclass MyItem(scrapy.Item):title = scrapy.Field()link = scrapy.Field()

        在这个示例中,我们创建了一个名为 MyItem 的 Item 类,定义了两个字段 titlelink,分别用于存储网页中的标题和链接。这样定义后,我们在 Spider 中抓取到数据后,就可以将数据封装为 MyItem 对象,并交给 Pipeline 进行处理。 

3、Pipeline

(1)作用和用法:

        Pipeline 是用来处理爬取到的数据的组件。当 Spider 提取到数据后,数据会被交给 Pipeline 进行处理,可以进行数据清洗、过滤、验证、存储等操作。Pipeline 可以定义多个,按照优先级依次处理数据。

(2)编写 Pipeline 的步骤

编写 Pipeline 的步骤如下:

  1. 创建一个类,实现 process_item 方法。
  2. process_item 方法中对爬取到的数据进行处理,并返回处理后的数据或者抛出异常。

(3)示例

下面是一个简单的示例,展示了如何编写一个 Pipeline 来处理爬取到的数据并存储到文件中:

class MyPipeline(object):def process_item(self, item, spider):# 处理爬取到的数据,存储到文件中with open('data.txt', 'a', encoding='utf-8') as f:f.write(f"{item['title']}, {item['link']}\n")return item

        在这个示例中,我们创建了一个名为 MyPipeline 的 Pipeline 类,实现了 process_item 方法。在 process_item 方法中,我们对爬取到的数据进行处理,并将数据存储到文件 'data.txt' 中。最后,我们返回处理后的数据,以便后续的 Pipeline 继续处理或者返回给 Spider。 

4、Middleware

(1)作用和用法:

        Middleware 是 Scrapy 框架的中间件,用于处理请求和响应的过程。它可以在请求被 Spider 处理前和响应被 Spider 处理后对其进行预处理或后处理。Middleware 可以用于修改请求和响应、处理异常、实现代理和用户认证等功能。

(2)编写 Middleware 的步骤

编写 Middleware 的步骤如下:

  1. 创建一个类,实现 process_requestprocess_response 方法。
  2. process_request 方法中对请求进行预处理,然后返回处理后的请求对象。
  3. process_response 方法中对响应进行后处理,然后返回处理后的响应对象。

(3)示例

下面是一个简单的示例,展示了如何编写一个 Middleware 来实现请求和响应的日志记录:

class MyMiddleware(object):def process_request(self, request, spider):# 在请求被 Spider 处理前进行预处理print(f"Processing request: {request.url}")return requestdef process_response(self, request, response, spider):# 在响应被 Spider 处理后进行后处理print(f"Processing response: {response.url}")return response

        在这个示例中,我们创建了一个名为 MyMiddleware 的 Middleware 类,实现了 process_requestprocess_response 方法。在 process_request 方法中,我们打印了请求的 URL,在 process_response 方法中,我们打印了响应的 URL。通过这样的方式,我们可以记录请求和响应的信息,方便进行调试和监控。

5、完整示例

        下面是一个简单的示例,演示了如何使用 Scrapy 框架创建一个爬虫,爬取 Quotes to Scrape 网站上的名言,并将结果保存到 JSON 文件中。

import scrapy
from scrapy.crawler import CrawlerProcessclass QuotesSpider(scrapy.Spider):name = 'quotes'start_urls = ['http://quotes.toscrape.com']def parse(self, response):for quote in response.css('div.quote'):yield {'text': quote.css('span.text::text').get(),'author': quote.css('span small::text').get(),'tags': quote.css('div.tags a.tag::text').getall(),}next_page = response.css('li.next a::attr(href)').get()if next_page is not None:yield response.follow(next_page, self.parse)# 定义 Scrapy 爬虫的设置
custom_settings = {'FEEDS': {'quotes.json': {'format': 'json'}}, # 将结果保存到 quotes.json 文件中
}# 创建一个 CrawlerProcess 并运行我们的爬虫
process = CrawlerProcess(settings=custom_settings)
process.crawl(QuotesSpider)
process.start()

        运行上述代码,它将从 Quotes to Scrape 网站上抓取名言数据,并将结果保存到 quotes.json 文件中。

四、Scrapy 高级用法

        Scrapy 提供了许多高级功能和技巧,可以帮助你进一步优化和提升爬虫的效率和性能。在这一部分,我们将介绍 Scrapy 的三个高级用法:异步处理、用户代理和 IP 代理、以及分布式爬取。

1、异步处理

异步处理机制:

Scrapy 使用异步处理机制来提高爬取效率。异步处理允许多个操作同时进行,而不会阻塞其他操作。在 Scrapy 中,下载器、中间件和爬虫等组件都是基于 Twisted 框架实现的,利用 Twisted 的事件驱动模型实现了异步处理。

利用异步处理提升爬取效率:

要利用异步处理提升爬取效率,可以注意以下几点:

  • 使用异步请求:Scrapy 默认使用异步请求下载网页,可以同时下载多个网页,提高爬取效率。
  • 使用异步中间件:编写自定义的异步中间件,可以在请求发送和响应处理过程中执行异步操作,如请求重试、代理切换等。
  • 避免阻塞操作:在 Spider 中尽量避免执行阻塞操作,如文件 I/O、数据库查询等,以充分发挥异步处理的优势。

        在 Scrapy 中,默认已经实现了异步处理,但你也可以自定义异步中间件来执行一些异步操作。以下是一个简单的异步中间件示例,用于在请求发送前和响应处理后打印日志:

import scrapy
from twisted.internet.defer import Deferredclass AsyncMiddleware:def process_request(self, request, spider):# 在请求发送前执行异步操作d = Deferred()d.addCallback(self.print_log)d.callback(request)return ddef process_response(self, request, response, spider):# 在响应处理后执行异步操作d = Deferred()d.addCallback(self.print_log)d.callback(response)return ddef print_log(self, result):print("Async operation completed:", result)class MySpider(scrapy.Spider):name = 'example'start_urls = ['http://example.com']def parse(self, response):pass

2、用户代理和IP代理

设置用户代理和 IP 代理:

在进行网页抓取时,有些网站会根据请求的用户代理(User-Agent)和 IP 地址来识别爬虫并限制访问。为了规避这些限制,可以设置用户代理和 IP 代理。

常用的用户代理和 IP 代理获取方法:

  • 用户代理:可以在 Spider 中设置 USER_AGENT,也可以使用第三方的用户代理池服务,如 Fake User-Agent、fake-useragent 等。
  • IP 代理:可以使用公开的免费代理,也可以购买付费代理服务,如阿布云、快代理等。

        在 Scrapy 中设置用户代理和 IP 代理可以通过在 Spider 中设置请求头部信息来实现。以下是一个示例,使用随机的用户代理来发送请求:

import scrapy
from scrapy import Request
from fake_useragent import UserAgentclass MySpider(scrapy.Spider):name = 'example'start_urls = ['http://example.com']def parse(self, response):# 随机生成用户代理user_agent = UserAgent().random# 设置请求头部信息headers = {'User-Agent': user_agent}# 发送请求yield Request(url="http://example.com", headers=headers, callback=self.parse_page)def parse_page(self, response):pass

3、分布式爬取

分布式爬取功能:

Scrapy 支持分布式爬取,可以在多台机器上运行爬虫,并将抓取到的数据统一存储或处理。分布式爬取可以提高爬取速度和效率,同时也增加了系统的可扩展性和稳定性。

利用分布式爬取提高爬取速度和效率:

要利用分布式爬取提高爬取速度和效率,可以采取以下措施:

  • 使用分布式任务调度器:如 scrapy-redis、scrapy-cluster 等,用于在多台机器之间协调任务调度和数据交换。
  • 使用分布式存储和处理:将爬取到的数据存储在分布式数据库或对象存储中,如 MongoDB、Elasticsearch、Hadoop 等,以及使用分布式计算框架进行数据处理和分析。

        要实现分布式爬取,可以使用 Scrapy-Redis 组件。Scrapy-Redis 提供了分布式爬取的支持,可以通过 Redis 来协调多个爬虫节点的任务调度和数据交换。以下是一个简单的示例,展示了如何在 Scrapy-Redis 中配置和使用分布式爬取:

import scrapy
import scrapy_redisclass MySpider(scrapy.Spider):name = 'example'start_urls = ['http://example.com']def parse(self, response):pass# 配置 Scrapy-Redis
REDIS_URL = 'redis://localhost:6379'
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300,
}# 配置 Redis 连接信息
REDIS_HOST = 'localhost'
REDIS_PORT = 6379

五、常见问题

1、如何处理反爬虫机制?

问题: 部分网站可能会设置反爬虫机制,如限制频繁请求、检测用户代理等,导致爬虫无法正常工作。

解答: 可以采取以下措施应对反爬虫机制:

  • 设置合理的下载延迟和并发量,避免频繁请求。
  • 使用随机的用户代理和 IP 代理,防止被网站识别为爬虫。
  • 使用验证码识别工具或人工识别验证码。
  • 分析网站的反爬虫策略,针对性地调整爬虫策略和参数。

2、如何处理网页内容解析错误?

问题: 在解析网页内容时,可能会遇到 HTML 结构变化、元素定位错误等问题,导致数据提取失败。

解答: 可以采取以下措施应对网页内容解析错误:

  • 使用更加精确的 CSS 选择器或 XPath 表达式来定位元素,避免因页面结构变化导致定位失败。
  • 编写容错处理逻辑,处理解析失败的情况,如设置默认值、捕获异常等。
  • 分析网页结构变化的原因,及时更新爬虫代码以适应新的页面结构。

3、如何处理数据存储和处理错误?

问题: 在数据存储和处理过程中,可能会遇到数据库连接错误、数据格式错误等问题,导致数据丢失或存储失败。

解答: 可以采取以下措施应对数据存储和处理错误:

  • 添加异常处理逻辑,捕获可能出现的异常并进行处理,如重新连接数据库、记录错误日志等。
  • 使用数据验证工具或库,对爬取到的数据进行验证和清洗,保证数据的完整性和准确性。
  • 使用分布式存储和处理方案,将数据存储在多个节点,提高系统的可靠性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion安装记录II

文章目录 前言0 更改python路径(跳过)1 Torch is not able to use GPU1.1 确认显卡1.2 安装nvdia驱动 1.3 检查CUDA1.4更改启动脚本 2 依赖安装2.1 pip install报错2.2 git报错2.3 卡在installing requirements 3 启动咯~3.1 clip报错 4 成功运行4.1 遗留…

go 针对 time类型字段,前端查询,后端返回数据格式为UTC时间

测试代码 package mainimport ("context""log""net/http""time""github.com/gin-gonic/gin""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/m…

Ubuntu22.04之解决:Flameshot无法截图问题(二百三十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

低代码是什么?开发系统更有什么优势?

低代码(Low-Code)是一种应用开发方法,它采用图形化界面和预构建的模块,使得开发者能够通过少量的手动编程来快速创建应用程序。这种方法显著减少了传统软件开发中的手动编码量,提高了开发效率,降低了技术门…

Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游&#xff…

堆排序-java

这次主要讲了堆排序和堆的基本构造,下一期会详细讲述堆的各种基本操作。 文章目录 前言 一、堆排序 1.题目描述 2.堆 二、算法思路 1.堆的存储 2. 结点下移down 3.结点上移up 4.堆的基本操作 5.堆的初始化 三、代码如下 1.代码如下: 2.读入数据&#xff…

重庆人文科技学院建立“软件安全产学研基地”,推动西南地区软件安全发展

5月29日,重庆人文科技学院与开源网安签订了《产学研校企合作协议》,并举行了“重庆人文科技学院产学研基地”授牌仪式,此次合作不仅深化了双方在软件安全领域的产学研紧密联结,更是对川渝乃至西南地区软件供应链安全发展起到重要的…

C++17之std::void_t

目录 1.std::void_t 的原理 2.std::void_t 的应用 2.1.判断成员存在性 2.1.1.判断嵌套类型定义 2.1.2 判断成员是否存在 2.2 判断表达式是否合法 2.2.1 判断是否支持前置运算符 2.2.3 判断两个类型是否可做加法运算 3.std::void_t 与 std::enable_if 1.std::void_t 的…

相机等效焦距

1. 背景 物理焦距我们很熟悉,但是在接触实际的相机参数时,相机厂家会提到一个参数等效焦距,甚至有时候不提供物理焦距,这时候如果我们得到真实的物理焦距需要进行一定的转换.在介绍两者之间的转换关系前,先介绍一下等效焦距的由来. 如上图,假设在某一个镜头,其成像面会出现图…

操作系统 - 文件管理

文件管理 考纲内容 文件 文件的基本概念;文件元数据和索引节点(inode) 文件的操作:建立,删除,打开,关闭,读,写 文件的保护;文件的逻辑结构;文件的物理结构目录 目录的基…

Multipass虚拟机磁盘扩容

Multipass 是一个用于轻松创建和管理 Ubuntu 虚拟机的工具,特别适合开发环境。要使用 Multipass 扩大虚拟机的磁盘容量,你需要经历几个步骤,因为 Multipass 自身并不直接提供图形界面来调整磁盘大小。不过,你可以通过结合 Multipa…

UE5 Http Server

前言 最近要用UE 作为一个服务器去接收来自外部的请求,从而在UE中处理一些内容,但是之前只做过请求,哪整过这玩意,短期内还得出结果,那怎么搞嘞,本着省事的原则就找找呗,有没有现成的&#xff0…

Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…

【Linux】进程间通信(System V IPC)

这节我们开始学习System V IPC方案。 分别是共享内存&#xff0c;消息队列与信号量 会着重讲解共享内存&#xff0c;但是消息队列与信号量只会说明一下原理。 原因&#xff1a;System V是新设计的一套标准 与文件的整合度不高只能进行本地通信 更何况&#xff0c;我们现在有…

IP代理池是什么?

从事跨境行业的朋友们总会有一个疑问&#xff0c;为什么自己所合作的IP代理商的IP在使用的过程中账号会有莫名封禁的问题&#xff0c;会不会是自己在使用的过程中错误的操作违反了平台的规则&#xff0c;其实不然有可能会是IP代理池纯净度不高的问题&#xff0c;有可能自己在使…

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 1.1 k8s环境 1&#xff09;Kubernetes 集群版本是 1.20.6 2&#xff09;k8s控制节点&#xff1a; IP&#xff1a;192.168.140.130 主机名&#xff1a;k8s-master 配置&#xff1a;4C6G 3&#xff09;k8s工作节点 节点1&#xff1a; IP&#xff1a;192.1…

基于字典树可视化 COCA20000 词汇

COCA20000 是美国当代语料库中最常见的 20000 个词汇&#xff0c;不过实际上有一些重复&#xff0c;去重之后大概是 17600 个&#xff0c;这些单词是很有用&#xff0c;如果能掌握这些单词&#xff0c;相信会对英语的能力有一个较大的提升。我很早就下载了这些单词&#xff0c;…

C++一个StringBad类

设计一个字符串类,下面的代码是一个不好的设计,起名StringBad。 //stringbad.h #pragma once //一个设计有问题的string类 #include <iostream> using namespace std;class StringBad { public:StringBad();//默认构造函数StringBad(const char* s);//构造函数~StringBa…

Java web应用性能分析之【jvisualvm远程连接云服务器】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 前面整理了java进程问题分析和分析工具&#xff0c;现在可以详细看看jvisualvm的使用&#xff0c;一般java进程都是部署云服务器&#xff0c;或者托管IDC机…

编译选项导致的结构体字节参数异常

文章目录 前言问题描述原因分析问题解决总结 前言 在构建编译工程时&#xff0c;会有一些对应的编译配置选项&#xff0c;不同的编译器&#xff0c;会有对应的配置项。本文介绍GHS工程中编译选项配置不对应导致的异常。 问题描述 在S32K3集成工程中&#xff0c;核1的INP_SWC…