大模型赋能:爬虫技术的全新革命

大模型加持下的爬虫技术革新:从BS4到提示工程的飞跃
在爬虫技术的演进历程中,内容解析一直是一个核心环节。传统的爬虫技术,如使用BeautifulSoup(BS4)等工具,需要逐个解析网页内容,通过XPath或CSS选择器等方式定位并提取所需信息。然而,随着人工智能技术的快速发展,特别是大模型的崛起,内容解析的方式正在发生深刻变革。本文将重点探讨大模型加持下的爬虫技术,对比传统方法与新型提示工程在内容解析上的差异,并给出相应的示例代码。

一、传统爬虫内容解析方法:BS4与XPath

在过去,爬虫开发者通常使用BS4等库来解析网页内容。BS4提供了丰富的API,使得开发者能够方便地通过XPath或CSS选择器定位到页面中的特定元素,并提取出所需的信息。例如,要解析一个页面的标题和段落内容,可以使用类似以下的代码:

from bs4 import BeautifulSoup  
import requests  
  
# 发送请求获取页面内容  
response = requests.get('http://example.com')  
soup = BeautifulSoup(response.text, 'html.parser')  
  
# 使用XPath语法解析标题  
title = soup.select_one('title').text  
  
# 使用XPath语法解析段落  
paragraphs = soup.select('p')  
for paragraph in paragraphs:  
    print(paragraph.text)

这种方法的优点是直观易懂,开发者可以通过阅读HTML结构来编写XPath或CSS选择器。然而,它也存在一些明显的缺点:首先,对于复杂的页面结构,编写准确的选择器可能是一项繁琐且容易出错的任务;其次,当页面结构发生变化时,选择器可能需要重新编写,导致维护成本增加;最后,这种方法无法充分利用网页中的语义信息,对于某些复杂的内容解析任务可能效果不佳。

二、大模型加持下的内容解析:提示工程的崛起

随着大模型技术的发展,内容解析的方式发生了革命性的变化。现在,我们可以将网页的源码直接输入给大模型,并通过提示工程让模型自动抽取标题、正文等信息,同时去除多余的HTML标记。这种方法不仅简化了开发流程,还提高了内容解析的准确性和效率。
以下是一个简单的示例,展示如何使用大模型进行内容解析:

import requests  
from transformers import pipeline  
  
# 加载预训练的大模型  
model = pipeline("text-extraction", model="your-large-model")  
  
# 发送请求获取页面内容  
response = requests.get('http://example.com')  
html_content = response.text  
  
# 将页面源码输入给大模型进行内容解析  
extracted_info = model("抽取给定内容中的标题和正文:" + html_content)  
  
# 提取标题和正文等信息  
title = extracted_info['title']  
text = extracted_info['text']  
  
# 打印解析结果  
print("Title:", title)  
print("Text:", text)

在这个示例中,我们使用了Hugging Face的Transformers库来加载预训练的大模型。通过将页面源码输入给模型,并指定相应的提示(如"提取标题"和"提取正文"),模型能够自动抽取出所需的信息,并去除多余的HTML标记。这种方法不仅简化了代码量,还提高了内容解析的准确性和效率。

三、两种方法的优劣分析

传统爬虫内容解析方法(如BS4+XPath)与大使用大模型(如当前的ChatGLM-3)结合提示工程(Prompt Engineering)来实现页面内容的抽取方法各有优劣。传统方法直观易懂,开发者可以通过阅读HTML结构来编写选择器。然而,它对于复杂页面结构的处理能力有限,且维护成本较高。相比之下,大模型方法能够自动抽取内容并去除多余标记,提高了准确性和效率。但是,它依赖于预训练的大模型,需要消耗更多的计算资源,并且对于某些特定任务可能需要定制化的模型训练。
传统方法(如bs4或XPath)的优势和劣势:
优势:

  1. 精确性:传统方法可以精确地定位到HTML文档中的特定元素。
  2. 性能:通常比使用大模型更快,因为它们直接操作DOM结构。
  3. 可预测性:结果更加可预测,因为它们是基于固定的规则和模式。

劣势:

  1. 灵活性:当页面结构发生变化时,需要更新XPath或bs4的选择器。
  2. 复杂性:对于复杂的HTML结构,编写和维护选择器可能变得困难。
  3. 扩展性:在处理大量不同结构的网页时,可能需要为每个页面编写不同的选择器。

使用大模型(如ChatGLM-3)结合提示工程的优势和劣势:
优势:

  1. 灵活性:能够处理各种格式的文本和数据,不依赖于固定的页面结构。
  2. 适应性:当页面结构发生变化时,通常不需要修改提示词。
  3. 智能性:能够理解更复杂的指令和上下文。

劣势:

  1. 性能:大模型通常比传统方法更慢,尤其是在处理大量数据时。
  2. 精确性:可能不如传统方法精确,因为它们是基于自然语言理解的。
  3. 成本:运行大模型可能需要更多的计算资源。
3.1 传统方法(BeautifulSoup)示例:
from bs4 import BeautifulSoup  
  
html_doc = """  
<html>  
<head>  
    <title>Example Page</title>  
</head>  
<body>  
    <p class="title">This is a title</p>  
    <p class="content">This is the content.</p>  
</body>  
</html>  
"""  
  
soup = BeautifulSoup(html_doc, 'html.parser')  
title = soup.find('p', {'class': 'title'}).text  
content = soup.find('p', {'class': 'content'}).text  
print(f"Title: {title}")  
print(f"Content: {content}")
3.2 XPath示例:假设你正在使用lxml库来解析HTML。
from lxml import html  
  
html_content = """  
<html>  
<head>  
    <title>Example Page</title>  
</head>  
<body>  
    <p class="title">This is a title</p>  
    <p class="content">This is the content.</p>  
</body>  
</html>  
"""  
  
tree = html.fromstring(html_content)  
title = tree.xpath('//p[@class="title"]/text()')[0]  
content = tree.xpath('//p[@class="content"]/text()')[0]  
print(f"Title: {title}")  
print(f"Content: {content}")
3.3 使用ChatGLM-3的提示词示例:

假设你已经有了HTML内容,并想通过ChatGLM-3来提取标题和内容。提示词:

请从以下HTML内容中提取出标题和内容的文本:  
<html>  
<head>  
    <title>Example Page</title>  
</head>  
<body>  
    <p class="title">This is a title</p>  
    <p class="content">This is the content.</p>  
</body>  
</html>  
标题是:  
内容是:

注意:在实际应用中,你需要将上述HTML内容粘贴到ChatGLM-3的输入框中,并附上提示词。然后,ChatGLM-3将尝试根据提示词从HTML中提取所需的信息。

四、爬虫常见问题及解决方案

4.1. IP被封问题

当爬虫发送的请求过于频繁或数量过大时,可能会导致IP被封禁。解决这个问题的一种方法是使用IP池,即维护一个包含多个可用IP的列表,当某个IP被封禁时,切换到另一个IP继续爬取。
在爬虫任务中,IP被封是一个常见问题。这主要是因为爬虫在短时间内向目标网站发送了大量的请求,这种异常流量模式可能触发网站的安全机制,从而导致IP地址被封禁。封禁可能是临时的,也可能是永久的,具体取决于目标网站的安全策略和反爬虫机制。常见的几种解决方法:

  1. 设置请求延时:通过增加爬虫请求之间的时间间隔,减少单位时间内发出的请求数量,以降低被封禁的风险。
  2. 使用代理IP:通过代理服务器发送请求,可以隐藏真实IP地址,并且可以在代理IP被封后更换新的代理。

image.png

  1. 使用Web服务API:如果目标网站提供API接口,最好通过API进行数据抓取,这样通常不会触发反爬虫机制。
  2. 分布式爬虫:将爬虫程序部署在多个服务器上,分散请求压力,减少单个IP的请求频率。
  3. 伪装User-Agent和Referer:模拟浏览器行为,设置随机的User-Agent和Referer,以避免被识别为爬虫。
  4. 处理异常和重试:编写异常处理逻辑,当检测到IP被封时,可以暂停爬虫一段时间后再重试。
  5. 使用专门的爬虫工具或库:如Scrapy、Selenium等,这些工具通常内置了一些反反爬虫的策略。

在Python中,可以使用concurrent.futures模块中的ThreadPoolExecutor来创建一个线程池,用于并发执行爬虫任务。以下是一个简单的示例:

import concurrent.futures  
import requests  
import time  
  
# 假设这是你的爬虫函数  
def crawl_page(url):  
    proxies = get_proxy()  # 假设这个函数用于获取一个有效的代理IP  
    headers = {'User-Agent': 'Mozilla/5.0'}  
    response = requests.get(url, proxies=proxies, headers=headers)  
    # 处理响应...  
    return response.text  
  
# 假设这个函数用于获取代理IP,此处为示例,需要根据实际情况实现  
def get_proxy():  
    # 返回代理服务器的信息,例如:{'http': 'http://代理服务器地址:端口', 'https': 'https://代理服务器地址:端口'}  
    pass  
  
# 要抓取的URL列表  
urls = ['http://example.com/page1', 'http://example.com/page2', ...]  
  
# 创建一个线程池,线程数为5  
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:  
    # 使用线程池并发执行爬虫任务  
    future_to_url = {executor.submit(crawl_page, url): url for url in urls}  
    for future in concurrent.futures.as_completed(future_to_url):  
        url = future_to_url[future]  
        try:  
            # 获取爬虫结果  
            data = future.result()  
        except Exception as exc:  
            print(f'{url} generated an exception: {exc}')  
        else:  
            print(f'{url} page is {len(data)} bytes')

请注意,为了简化示例,省略了异常处理和一些细节(如代理IP的获取和更换逻辑)。在实际应用中,你需要根据目标网站的具体情况和反爬虫策略来调整代码。此外,使用代理时需要注意代理的稳定性和可用性,以及是否遵守了代理服务提供商的使用条款。

4.2. 登录验证

有些页面需要登录后才能访问。这时,我们可以通过在请求头中携带cookie信息来模拟登录状态。cookie可以通过在浏览器中登录知乎后获取。
在进行网络爬虫任务时,经常会遇到需要登录验证的网站。登录验证是网站为了保护用户数据和防止自动化脚本恶意访问而设置的一种安全机制。当爬虫试图访问需要登录后才能查看的内容时,如果未通过登录验证,通常会被重定向到登录页面或者被服务器拒绝访问。
登录验证问题对爬虫来说是一个挑战,因为它要求爬虫模拟用户登录过程,这通常涉及到处理HTTP请求、Cookies、Session以及可能的验证码等。
常见的几种解决方法

  1. 模拟登录过程
    • 分析网站的登录流程,包括请求的URL、请求方法(GET或POST)、提交的表单数据等。
    • 使用编程语言中的HTTP库(如Python的requests库)来模拟这个登录过程,发送正确的登录表单数据,并处理登录成功后返回的Cookies或Tokens。
  2. 使用Selenium或Puppeteer等工具
    • 这些工具可以模拟真实的浏览器环境,自动处理Cookies、JavaScript执行等复杂问题。
    • 通过Selenium或Puppeteer,可以模拟用户点击登录按钮,输入用户名和密码等操作,从而绕过登录验证。
  3. 使用已有的登录API
    • 一些网站会提供API接口供开发者使用,如果网站提供了登录API,可以直接使用该API进行登录验证。
  4. 处理验证码
    • 登录过程中可能会遇到验证码挑战,这时可以使用OCR(光学字符识别)技术来识别验证码。
    • 或者使用第三方验证码识别服务。
    • 对于一些简单的验证码,也可以尝试手动输入验证码来获取登录后的Cookies,并在爬虫中使用这些Cookies。
  5. 使用已登录用户的Cookies
    • 如果可能的话,可以通过浏览器手动登录后导出Cookies,并在爬虫中使用这些Cookies来绕过登录验证。
    • 但这种方法可能不是长久之计,因为Cookies可能会过期或被服务器定期刷新。
  6. 分布式爬虫与IP轮询
    • 对于需要频繁登录的情况,可以使用分布式爬虫架构,将登录任务分散到多个爬虫实例上。
    • 结合IP轮询技术,使用不同的IP地址进行登录尝试,以降低单个IP被封锁的风险。
  7. 与网站开发者协商
    • 如果爬虫的目的是为了学术研究或数据分析等合法用途,可以尝试与网站开发者或管理员协商,请求提供API接口或特殊的数据获取方式。
4.3. 翻页问题

知乎的回答通常是分页显示的,每页包含一定数量的回答。为了获取所有回答,我们需要循环发送请求,每次请求时修改URL中的偏移量(offset)参数,以实现翻页功能。
在爬虫任务中,翻页问题是指当需要从网站上爬取大量数据时,这些数据可能分布在多个页面中,因此爬虫需要能够自动地遍历这些页面以收集所有数据。翻页问题主要涉及如何识别和访问网站中的后续页面。由于网站设计和实现的不同,翻页机制也各异,这增加了爬虫翻页处理的复杂性。常见的几种解决方法:

  1. 基于URL模式的翻页
    有些网站的URL中会包含页码信息,例如example.com/page/1、example.com/page/2等。这种情况下,爬虫可以通过改变URL中的页码部分来访问不同的页面。
  2. 基于链接的翻页
    许多网站在页面底部提供“下一页”或页码链接。爬虫可以通过解析这些链接来找到并访问后续页面。这通常需要使用HTML解析库(如BeautifulSoup)来定位和提取这些链接。
  3. 基于JavaScript的翻页
    有些网站使用JavaScript(特别是Ajax)来加载后续内容,而不是通过传统的页面刷新。在这种情况下,爬虫需要模拟这些Ajax请求或使用Selenium等工具来执行JavaScript并捕获动态加载的内容。
  4. 基于表单提交的翻页
    某些网站的翻页机制可能涉及表单提交,例如通过POST请求发送页码信息到服务器。爬虫需要模拟这些表单提交来获取不同页面的数据。
  5. 使用网站API
    如果目标网站提供了API接口来访问数据,那么最直接的翻页方式就是通过API的分页参数来获取不同页面的数据。这通常是最稳定和最高效的方法。
  6. 无限滚动页面
    对于无限滚动的页面(当用户滚动到页面底部时,新内容会自动加载),爬虫需要模拟滚动事件或使用特定的JavaScript调用来触发内容加载。
  7. 处理反爬虫机制
    有些网站会使用各种反爬虫技术来阻止自动化访问。在处理翻页时,爬虫可能需要处理验证码、Cookies、User-Agent检查等反爬虫机制。
  8. 设置适当的延迟
    为了避免被目标网站封锁或限制访问,爬虫在翻页过程中应设置适当的请求延迟,以模拟人类用户的正常访问速度。
  9. 错误处理和重试机制
    由于网络问题或目标网站的变动,爬虫在翻页过程中可能会遇到失败的情况。实现一个健壮的错误处理和重试机制对于确保爬虫的稳定运行至关重要。
4.4 反爬虫机制

通常情况下,网站采用了一系列的反爬虫机制来防止数据被恶意爬取。例如,可能会检测请求的频率、来源、是否携带了正确的cookie等。为了应对这些反爬虫机制,我们可以采取一些策略,如设置合理的请求间隔、使用代理IP、模拟用户行为等。
反爬虫机制是网站为了保护自身数据、防止内容被恶意爬取或滥用而设置的一系列技术手段。这些机制旨在识别和阻止自动化爬虫程序的访问,从而确保网站数据的安全性和服务的稳定性。当爬虫程序触发这些反爬虫机制时,可能会面临被封禁IP、访问受限或接收错误数据等风险。常见的几种解决方法:

  1. 设置合理的请求间隔
    • 通过增加爬虫请求之间的时间间隔,模拟人类用户的正常访问频率,以降低触发反爬虫机制的风险。
  2. 使用代理IP
    • 使用代理服务器发送请求可以隐藏爬虫的真实IP地址,避免因频繁请求而被封禁。可以通过购买或获取免费的代理IP池,并在爬虫中随机选择代理进行请求。
  3. 伪装User-Agent
    • 通过设置随机的User-Agent,模拟不同浏览器或设备的访问,以规避基于User-Agent的反爬虫策略。
  4. 处理Cookies和Session
    • 对于需要登录或保持会话状态的网站,正确处理Cookies和Session信息是关键。可以通过模拟登录过程获取Cookies,并在后续请求中携带这些Cookies。
  5. 分布式爬虫
    • 将爬虫程序部署在多个服务器或IP上,分散请求压力,减少单个IP的请求频率,从而降低被封禁的风险。
  6. 错误处理和重试机制
    • 当爬虫遇到反爬虫机制导致的访问受限或错误时,实现合理的错误处理和重试机制,以避免因临时封禁而导致的爬虫失败。
  7. 使用Web服务API
    • 如果目标网站提供API接口,最好通过API进行数据抓取,这样通常不会触发网站的反爬虫机制。
  8. 遵守robots.txt规则
    • 在进行爬虫任务前,检查并遵守目标网站的robots.txt文件规则,以确保爬虫行为的合法性。
  9. 图像识别和验证码处理
    • 对于包含验证码的反爬虫机制,可以使用图像识别技术(如OCR)来自动识别验证码,或者通过第三方服务来解决。
  10. 限制爬取速率和深度
  • 合理设置爬虫的爬取速率和爬取深度,避免对目标网站造成过大的访问压力。
  1. 使用专业的爬虫框架或库
  • 利用像Scrapy、BeautifulSoup、Selenium等专业的爬虫框架或库,它们通常内置了一些反反爬虫的策略和机制。

五、总结与展望

随着大模型技术的不断发展,内容解析的方式正在发生深刻变革。大模型加持下的提示工程方法为爬虫技术带来了前所未有的便利和效率提升。然而,我们也应该意识到,这种方法并非万能之药,它仍然需要结合具体任务进行定制化的优化和调整。未来,我们期待看到更多关于大模型在爬虫领域的应用和研究,以推动这一技术的进一步发展和完善。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NPS】内网穿透工具之 NPS

一、linux 安装 nps nps-releases&#xff1a;https://github.com/ehang-io/nps/releases 1.1、在 ubuntu下安装对应版本&#xff08;非docker&#xff09; 可以看到如下指令 wget https://ghproxy.com/https://github.com/ehang-io/nps/releases/download/v0.26.10/linux…

网络安全-自学笔记

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

weblogic JSP action的配置

action(如xxx.do)可以在Java文件中通过注解的方式配置,也可以在web.xml中进行配置 在java文件中配置的场合 @WebServlet(xxxx.do) 并实现支持的方法:doGet或doPost等 或者 @WebServlet(xxxx.do) 并实现service方法 所有method的处理方法都会先经过service方法 在web.x…

【24年物联网华为杯】赛题分析与初步计划

赛事介绍 官网链接&#xff1a;2024 年全国大学生物联网设计竞赛 (sjtu.edu.cn) 含金量&#xff1a;属于A类赛事 &#xff08;注意&#xff1a;很多搜索结果的序号是按照选入时间排列的&#xff0c;与含金量无关&#xff0c;华为杯是23年选入的&#xff09; Kimi Chat: 全国…

经历分享:我是如何出版了人生的第一本书的,成体系化的神级Golang进阶笔记,

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

轻松上手MYSQL:MYSQL初识(下)

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《MYSQL入门》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松上手MYSQL&#xff1a;从零开始构建你的数据库世界 &#x1f680; &#x1f680;欢迎来到My…

Qt nodeeditor ROI 组态软件

节点显示节点连接属性设置插件导入导出 展示&#xff1a;

【小贴士|Unity】华佗热更版本控制配置

现在越来越多的新项目选择使用HybridCLR&#xff0c;而不是以前的Lua。也不妨有的项目会配置打包机器人以及版本控制&#xff0c;但是这个版本控制的配置还真需要注意一些。&#xff08;因为我就踩坑了&#xff09; 如图所示&#xff0c;当你第一次执行HybridCLR/Generate/All后…

监控平台zabbix的认识与搭建

一. 监控系统的相关知识 1. 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabbix 可以实现集中监控管理的应用程序。 监控的…

基于51单片机的秒表设计—0.01精度、有提示音

基于51单片机的秒表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.数码管显示&#xff0c;精度为0.01&#xff1b; 2.按键控制启动/停止&#xff0c;暂停/开始&#xff1b; 3.有一秒钟一次提示…

金三银四面试题(二十):单例模式知多少?

设计模式也是面试中的热门考题&#xff0c;基本这个部分都是问问你知不知道XXX设计模式&#xff0c;有什么用&#xff0c;优缺点&#xff0c;然后再现场手写一个demo。很多时候是和spring一起考的&#xff0c;问问你知不知道spring框架用了哪些设计模式。今天我们来先看看单例模…

信息系统项目管理师——成本管理计算专题(一)

常见考点如下: ①问项目预算、BAC、成本基准、应急储备、管理储备的含义及它们之间的区别 ②给出成本基准和管理储备求项目预算&#xff0c;或者给出预算求成本基准等等 ③看图找 PV、AC、EV、SV、CV、BAC、EAC、ETC等 ④根据题干求项目的PV、AC、EV、SV、CV、BAC、EAC、ETC等 …

骑行听音乐用什么运动耳机?五款宝藏机型汇总推荐

热爱骑行的你们&#xff0c;是否曾为选购一款合适的运动蓝牙耳机而纠结&#xff1f;市面上品牌众多、功能各异的运动耳机&#xff0c;究竟哪款才是你的运动良伴&#xff1f;今天&#xff0c;我就来聊聊运动蓝牙耳机的选购要点&#xff0c;并为你推荐几款高性价比的运动蓝牙耳机…

OMS系统集成案例分享:数环通轻松实现OMS系统对接

在数字化浪潮席卷全球的今天&#xff0c;订单管理系统&#xff08;OMS&#xff09;作为连接企业与客户的桥梁&#xff0c;正逐渐成为企业提升订单处理效率、优化客户体验的关键。然而&#xff0c;由于企业内部系统的复杂性和多样性&#xff0c;OMS系统与其他业务系统的集成往往…

OCR技术可以通过识别身份证区分性别么?

可以&#xff0c;只需将它识别成结构化的数据&#xff0c;然后根据性别进行筛选即可。具体操作方法如下&#xff1a; 1、到金鸣识别官网下载安装金鸣表格文字识别电脑客户端。 2、打开安装好的金鸣表格文字识别电脑客户端。 3、点击“添加文件”&#xff0c;在弹出的对话框中选…

【C语言回顾】数组

前言1. 数组2. 一维数组2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用2.3.1 一维数组的下标2.3.2 一维数组的输入和输出 2.4 一维数组在内存中的存储 3. 二维数组3.1 二维数组的创建3.2 二维数组的初始化3.3 二维数组的使用3.3.1 二维数组的下标3.3.2 二维数组的输…

Lesson2: 算法的时间复杂度和空间复杂度

【本节目标】 1. 算法效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度 oj 练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;retu…

【模板】差分

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 2 1 2 3 1 2 4 3 3 -2 输出 5 6 1 思路&#xff1a; 一直以来&#xff0c;我总是不太理解差分和树状数组操作区别。 现在摸了一下开始有所理解了。 差分和树状数组的区别…

houdini assemble connectivity partion

官方文档 *****分开打包 非连续物体 各部份 打组 操作 partion connectivity assemble 三个物体&#xff0c;每个物体内的点&#xff0c;面线连接在一起&#xff0c;但每个物体之间分离 connectivity 查看点面数据属性&#xff1a;在原有属性上的变化 connectivity 对将归…

如何优化邮箱Webhook API发送邮件的性能?

邮箱Webhook API发送邮件的流程&#xff1f;怎么用邮箱API发信&#xff1f; 高效、稳定的邮箱Webhook API发送邮件功能对于企业的日常运营至关重要。随着业务量的增长&#xff0c;如何优化邮箱Webhook API发送邮件的性能。AokSend将从多个方面探讨如何提升的效率。 邮箱Webho…