当前位置: 首页 > news >正文

crawl4ai的实践(爬虫)

1.准备环境

!pip install -U crawl4ai
!pip install nest_asynciocrawl4ai-setup

验证是否安装成功

# Check crawl4ai version
import crawl4ai
print(crawl4ai.__version__.__version__)

验证是否可以爬

crawl4ai-doctor

2.简单示例

import asyncio
from playwright.async_api import async_playwrightasync def test_browser():async with async_playwright() as p:browser = await p.chromium.launch(headless=True)page = await browser.new_page()await page.goto('https://example.com')print(f'Title: {await page.title()}')await browser.close()asyncio.run(test_browser())

3.简单示例2

import asyncio
import nest_asyncio
nest_asyncio.apply()from crawl4ai import AsyncWebCrawler, CacheMode, BrowserConfig, CrawlerRunConfig, CacheModeasync def simple_crawl():crawler_run_config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS)async with AsyncWebCrawler() as crawler:result = await crawler.arun(url="https://www.kidocode.com/degrees/technology",config=crawler_run_config)print(result.markdown.raw_markdown[:500].replace("\n", " -- "))  # Print the first 500 charactersasyncio.run(simple_crawl())

4.动态内容抓取(模拟点击“Load More”按钮加载更多内容,再提取 Markdown 文本)

async def crawl_dynamic_content():# You can use wait_for to wait for a condition to be met before returning the result# wait_for = """() => {#     return Array.from(document.querySelectorAll('article.tease-card')).length > 10;# }"""# wait_for can be also just a css selector# wait_for = "article.tease-card:nth-child(10)"async with AsyncWebCrawler() as crawler:js_code = ["const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More')); loadMoreButton && loadMoreButton.click();"]config = CrawlerRunConfig(cache_mode=CacheMode.ENABLED,js_code=js_code,# wait_for=wait_for,)result = await crawler.arun(url="https://www.nbcnews.com/business",config=config,)print(result.markdown_v2.raw_markdown[:500].replace("\n", " -- "))  # Print first 500 charactersasyncio.run(crawl_dynamic_content())

5.内容过滤与 Markdown 精炼

from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGeneratorasync def clean_content():async with AsyncWebCrawler(verbose=True) as crawler:config = CrawlerRunConfig(cache_mode=CacheMode.ENABLED,excluded_tags=['nav', 'footer', 'aside'],remove_overlay_elements=True,markdown_generator=DefaultMarkdownGenerator(content_filter=PruningContentFilter(threshold=0.48, threshold_type="fixed", min_word_threshold=0),options={"ignore_links": True}),)result = await crawler.arun(url="https://en.wikipedia.org/wiki/Apple",config=config,)full_markdown_length = len(result.markdown_v2.raw_markdown)fit_markdown_length = len(result.markdown_v2.fit_markdown)print(f"Full Markdown Length: {full_markdown_length}")print(f"Fit Markdown Length: {fit_markdown_length}")asyncio.run(clean_content())

6.链接智能提取(过滤外部和社交媒体链接;提取页面中的站内链接并打印前 5 条(链接地址+文字)。


async def link_analysis():async with AsyncWebCrawler() as crawler:config = CrawlerRunConfig(cache_mode=CacheMode.ENABLED,exclude_external_links=True,exclude_social_media_links=True,# exclude_domains=["facebook.com", "twitter.com"])result = await crawler.arun(url="https://www.nbcnews.com/business",config=config,)print(f"Found {len(result.links['internal'])} internal links")print(f"Found {len(result.links['external'])} external links")for link in result.links['internal'][:5]:print(f"Href: {link['href']}\nText: {link['text']}\n")asyncio.run(link_analysis())

7.图片提取

async def media_handling():async with AsyncWebCrawler() as crawler:config = CrawlerRunConfig(cache_mode=CacheMode.ENABLED,exclude_external_images=False,# screenshot=True # Set this to True if you want to take a screenshot)result = await crawler.arun(url="https://www.nbcnews.com/business",config=config,)for img in result.media['images'][:5]:print(f"Image URL: {img['src']}, Alt: {img['alt']}, Score: {img['score']}")asyncio.run(media_handling())

8.使用 hook 自定义浏览器行为(方便克制反爬虫)

import asyncio
from crawl4ai import AsyncWebCrawler, CacheMode, CrawlerRunConfig, BrowserConfig
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
from playwright.async_api import Page, BrowserContext  # ✅ 补充导入类型# 定义 before_goto hook
async def before_goto(page: Page, context: BrowserContext, url: str, **kwargs):print(f"[HOOK] before_goto - About to visit: {url}")await page.set_extra_http_headers({"Custom-Header": "my-value"})return page# 主爬虫执行逻辑
async def custom_hook_workflow(verbose=True):async with AsyncWebCrawler(config=BrowserConfig(verbose=verbose)) as crawler:crawler.crawler_strategy.set_hook("before_goto", before_goto)result = await crawler.arun(url="https://crawl4ai.com",config=CrawlerRunConfig(cache_mode=CacheMode.BYPASS))print(result.markdown.raw_markdown[:500].replace("\n", " -- "))asyncio.run(custom_hook_workflow())
Hook 名称触发时机用途示例
on_browser_created浏览器实例被创建时初始化日志、调试信息打印
before_goto页面导航之前(尚未跳转)添加请求头、自定义 header/cookie
after_goto页面加载完成之后打印访问日志、调试跳转情况
on_execution_started页面 JS 开始执行前打印 JS 交互启动提示
before_return_htmlHTML 提取返回前(页面爬取完成)做 DOM 二次处理、页面校验

9. 多页爬取保持 session(分页抓取)

from crawl4ai.extraction_strategy import (JsonCssExtractionStrategy,LLMExtractionStrategy,
)
import jsonasync def crawl_dynamic_content_pages_method_2():print("\n--- Advanced Multi-Page Crawling with JavaScript Execution ---")async with AsyncWebCrawler() as crawler:url = "https://github.com/microsoft/TypeScript/commits/main"session_id = "typescript_commits_session"all_commits = []last_commit = ""js_next_page_and_wait = """(async () => {const getCurrentCommit = () => {const commits = document.querySelectorAll('li.Box-sc-g0xbh4-0 h4');return commits.length > 0 ? commits[0].textContent.trim() : null;};const initialCommit = getCurrentCommit();const button = document.querySelector('a[data-testid="pagination-next-button"]');if (button) button.click();// Poll for changeswhile (true) {await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100msconst newCommit = getCurrentCommit();if (newCommit && newCommit !== initialCommit) {break;}}})();"""schema = {"name": "Commit Extractor","baseSelector": "li.Box-sc-g0xbh4-0","fields": [{"name": "title","selector": "h4.markdown-title","type": "text","transform": "strip",},],}extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)for page in range(2):  # Crawl 2 pagesconfig = CrawlerRunConfig(cache_mode=CacheMode.BYPASS,session_id=session_id,css_selector="li.Box-sc-g0xbh4-0",extraction_strategy=extraction_strategy,js_code=js_next_page_and_wait if page > 0 else None,js_only=page > 0,)result = await crawler.arun(url=url,config=config)assert result.success, f"Failed to crawl page {page + 1}"commits = json.loads(result.extracted_content)all_commits.extend(commits)print(f"Page {page + 1}: Found {len(commits)} commits")await crawler.crawler_strategy.kill_session(session_id)print(f"Successfully crawled {len(all_commits)} commits across 3 pages")asyncio.run(crawl_dynamic_content_pages_method_2())

10.提取结构化数据(非 LLM)

import json
import asyncio
import nest_asyncio
nest_asyncio.apply()from crawl4ai import AsyncWebCrawler, CacheMode, CrawlerRunConfig
from crawl4ai.extraction_strategy import JsonCssExtractionStrategyasync def extract():# 定义页面结构 schemaschema = {"name": "KidoCode Courses","baseSelector": "section.charge-methodology .div-block-214.p-extraxx","fields": [{"name": "section_title","selector": "h3.heading-50","type": "text",},{"name": "section_description","selector": ".charge-content","type": "text",},{"name": "course_name","selector": ".text-block-93","type": "text",},{"name": "course_description","selector": ".course-content-text","type": "text",},{"name": "course_icon","selector": ".image-92","type": "attribute","attribute": "src"}]}extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)# 点击每个 tab 页的 JS 脚本js_click_tabs = """(async () => {const tabs = document.querySelectorAll("section.charge-methodology .tabs-menu-3 > div");for(let tab of tabs) {tab.scrollIntoView();tab.click();await new Promise(r => setTimeout(r, 500));}})();"""async with AsyncWebCrawler() as crawler:config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS,extraction_strategy=extraction_strategy,js_code=[js_click_tabs],)result = await crawler.arun(url="https://www.kidocode.com/degrees/technology",config=config)# 处理结构化内容courses = json.loads(result.extracted_content)print(result.extracted_content)print(f"✅ Successfully extracted {len(courses)} courses")print(f"📄 Markdown Length: {len(result.markdown.raw_markdown)}")# 正确调用异步主函数
asyncio.run(extract())

11.使用大模型抽取结构化信息

import asyncio
from crawl4ai import AsyncWebCrawler, CacheMode, CrawlerRunConfig
from openai import OpenAI
import json
from typing import List, Dictclient = OpenAI(base_url="https://openrouter.ai/api/v1",api_key=""
)async def fetch_markdown():async with AsyncWebCrawler(verbose=True) as crawler:result = await crawler.arun(url="https://openai.com/api/pricing/",config=CrawlerRunConfig(cache_mode=CacheMode.ENABLED))markdown = result.markdown.raw_markdownreturn markdownmarkdown_text = asyncio.run(fetch_markdown())
def llm_extract_markdown(markdown_text: str) -> List[Dict]:"""使用 Gemini 模型(OpenRouter 接入)从 markdown 中提取结构化模型价格信息"""prompt = f"""
以下是来自 OpenAI 官网的 API 定价页面内容(markdown 格式):
--------------------
{markdown_text}
--------------------请提取所有模型的价格信息,格式为 JSON 列表,每项包含:
- model_name
- input_fee
- output_fee返回格式如下:
[{{"model_name": "GPT-4o","input_fee": "$2.50 / 1M tokens","output_fee": "$10.00 / 1M tokens"}},...
]
如果某模型缺失 input/output,可写为空字符串。
只返回 JSON 内容,不要任何解释说明。
"""# ✅ 发起 Gemini 请求(OpenRouter)completion = client.chat.completions.create(model="google/gemini-2.5-pro-exp-03-25:free",extra_headers={"HTTP-Referer": "https://yourdomain.com",   # 可选,利于排行榜"X-Title": "LLM Extractor Example"          # 可选,用于 OpenRouter 统计},messages=[{"role": "user","content": prompt}])content = completion.choices[0].message.content.strip()try:return json.loads(content)except json.JSONDecodeError:print("❌ Gemini 返回内容不是合法 JSON:\n")print(content)return []result = llm_extract_markdown(markdown_text)print("\n✅ 提取结果:")
for item in result:print(item)

相关文章:

crawl4ai的实践(爬虫)

1.准备环境 !pip install -U crawl4ai !pip install nest_asynciocrawl4ai-setup 验证是否安装成功 # Check crawl4ai version import crawl4ai print(crawl4ai.__version__.__version__) 验证是否可以爬 crawl4ai-doctor 2.简单示例 import asyncio from playwright.as…...

Python从入门到精通全套视频教程免费

概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…...

Node.js是js语言在服务器编译运行的环境,什么是IP和域名

一句话结论 Node.js 不是语言也不是框架,而是一个让 JavaScript 能运行在服务器端的“环境”(类似 Python 的解释器)。JavaScript 是语言,Node.js 是它的“执行工具”。 🌰 用 Python 类比理解 Python 和 JavaScript …...

checkra1n越狱出现的USB error -10问题解决

使用checkra1n进行越狱是出现: 解决办法(使用命令行进行越狱): 1. cd /Applications/checkra1n.app/Contents/MacOS 2. ./checkra1n -cv 3. 先进入恢复模式 a .可使用爱思助手 b. 或者长按home,出现关机的滑条,同时按住home和电源键&#…...

如何利用 Java 爬虫获取京东商品详情信息

在电商领域,获取商品详情信息对于数据分析、市场研究和用户体验优化具有重要意义。京东作为国内知名的电商平台,提供了丰富的商品详情信息 API 接口。通过 Java 爬虫技术,我们可以高效地调用这些接口,获取商品的详细信息&#xff…...

【spark--scala】--环境配置

文章目录 scalaspark scala 官网下载二进制包 添加环境变量 #set scala export SCALA_HOME/usr/local/src/scala-2.11.8 export PATH$PATH:$SCALA_HOME/binspark 官网下载二进制包 解压后 spark/conf cp slaves.template slaves cp spark-env.sh.template spark-env.sh# s…...

Spark Core学习总结

一、Spark运行架构 1. 核心组件 Driver(驱动器): 执行main方法,负责将用户程序转换为作业(Job)。 调度任务(Task)到Executor,并监控任务执行状态。 通过UI展示作业运行情…...

Python深度学习基础——深度神经网络(DNN)(PyTorch)

张量 数组与张量 PyTorch 作为当前首屈一指的深度学习库,其将 NumPy 数组的语法尽数吸收,作为自己处理张量的基本语法,且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。 NumPy 和 PyTorch 的基础语法几乎一致,具体表现为&am…...

前端三件套—CSS入门

上篇文章: 前端三件套—HTML入门https://blog.csdn.net/sniper_fandc/article/details/147070026?fromshareblogdetail&sharetypeblogdetail&sharerId147070026&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 引入CSS …...

mapreduce-案例-简单的数据清洗案例代码

//1.从Mapper继承 //2.重写map方法 //LongWritable,Text:表示初始输入的键值对格式。LongWritable是键的数据类型,Text是值的数据类型 //Text,LongWritable:表示map函数输出的数据的格式。Text是键的数据类型,LongWritable是值的数据类型 public class W…...

为什么PDF文件更适合LLM大模型信息提取?

为什么PDF文件更适合LLM大模型信息提取? 在Dify平台中,我们通过LLM大模型提取上传文件中的指定信息。目前使用的大模型包括qwen2:7b和deepseek-r1:70b。然而,我们发现一个有趣的现象:在提取信息时,PDF文件的表现明显优…...

期权时间价值与隐含波动率怎么选?

期权隐含波动率与时间价值要怎么选?期权隐含波动率IV对期权价格有着巨大的影响。整体来看,期权隐波与期权价格呈正相关关系。当期权隐波从低水平上升时,期权价格也会相应上涨;反之,当隐波下降,期权价格则会…...

LangChain入门指南:调用DeepSeek api

文章目录 1. 什么是LangChain?2. 核心组件3. 为什么选择LangChain?4. 实战案例安装简单chat案例流式交互Prompt模板 5. 简单总结 1. 什么是LangChain? 定义:LangChain是一个用于构建大语言模型(LLM)应用的…...

Cherry Studio配置MCP server

MCP server在很多的app上开始支持了,从以前的claude desktop,到cursor,vscode等等,甚至现在开源的软件也都开始支持mcp协议的配置了.这里主要来说一下如何在cherry studio中配置好mcp的服务. cheery studio 中配置MCP并使用 基础配置过程Blender MCP百度地图GitGithubfilesyst…...

前端快速入门——JavaScript变量、控制语句

1.JavaScript 定义 JavaScript 简称 JS. JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果,增加用户与网页的交互性。 作为一种客户端脚本语言,JavaScript 可以直接嵌入 HTML,并在浏览器中执行。…...

[CISSP] [8] 安全模型,设计和能力的原则

开源软件(Open Source Software, OSS) 优点: 透明性高 开源软件的源代码对公众开放,安全专家和用户可以检查其实现,验证是否存在安全隐患。 社区驱动的漏洞发现 有大量开发者和安全研究人员参与代码审查,…...

docker使用

最近为了打vulhub也是搞了好久的docker,搞了半天搞得我头大,结果还是没能成功,不知道为什么起shiro550靶场总是报139的错误,在网上搜了半天也没有解决,有没有师傅救一下喵QaQ 安装就不说了喵,安装完记得换…...

phpexcel导出下拉框,超过255字符不显示的问题处理

用php生成excel模板,并设置下拉框的选项。如果选项太多,可能导致下拉框不显示的问题。下面会给出示例,以及解决方案,支持生成包含大量数据的下拉框。 // $info 为下拉框的数数据,[男,女,保密] function exportDataSel…...

【重构谷粒商城12】npm快速入门

重构谷粒商城12:npm快速入门 前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶…...

【Pandas】pandas DataFrame bool

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...

Django 在同一域名下使用 NGINX 服务器运行 Django 和 WordPress

在本文中,我们将介绍如何使用 NGINX 服务器在同一域名下同时运行 Django 和 WordPress。我们将使用反向代理和URL重写来实现这一目标。 1. 安装和配置 NGINX 首先,我们需要在服务器上安装并配置 NGINX。请根据您的操作系统类型和版本的要求,…...

LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵

目录 前言 一、子串 1. 和为 K 的子数组 2. 滑动窗口最大值 3. 最小覆盖子串 二、普通数组 4. 最大子数组和 5. 合并区间 6. 轮转数组 7. 除自身以外数组的乘积 8. 缺失的第一个正数 三、矩阵 9. 矩阵置零 10. 螺旋矩阵 11. 旋转图像 12. 搜索二维矩阵 II 前言 一、子串&#…...

游戏引擎学习第213天

回顾并为今天的工作做准备 今天我们将继续在调试界面上进行一些编码工作。我们已经完成了很多内容,并且昨天完成了与游戏的集成,主要是在两个系统之间统一了用户界面。 今天的目标是进入调试界面,进一步整理并完善它,以便我们能…...

使用 Django 构建 Web 应用程序:症状检测 - 分步指南

使用 Django 构建 Web 应用程序:症状检测 - 分步指南 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 使用 Django 构建 Web 应用程序:症状检测 - 分步指南先决条件第 1 步:设置 …...

oracle将varchar2 转为clob类型存储。 oracle不支持直接使用sql,将 varchar2 到clob的类型转换,需要下面操作

将一个现有表中的 VARCHAR2 列数据迁移到一个 CLOB 列的过程。以下是对每一步操作的说明: 1. 添加一个新的 CLOB 类型列 首先,向表中添加一个新的 CLOB 类型的列。这个列将用来存储原本的 VARCHAR2 数据。 ALTER TABLE your_table ADD (new_column CL…...

React 之 Redux 第三十一节 useDispatch() 和 useSelector()使用以及详细案例

使用 Redux 实现购物车案例 由于 redux 5.0 已经将 createStore 废弃,我们需要先将 reduxjs/toolkit 安装一下; yarn add reduxjs/toolkit// 或者 npm install reduxjs/toolkit使用 vite 创建 React 项目时候 配置路径别名 : // 第一种写法…...

RHCSA Linux系统 vim 编辑器

1.使用 vi/vim 编辑文件 [rootlocalhost ~]# vim /etc/passwd 默认进入命令模式 2.命令模式下的常用快捷键 (1) 光标跳转快捷键 (2)复制、粘贴、删除 3.编辑模式 4.末行模式 (1)查找关键字替换 (2&…...

ABAP小白开发操作手册+(十)验证和替代——下

目录 一、前言 二、替代步骤详解 1、新建替换 2、新建步骤 3、创建先决条件 4、补充替换 5、ZRGGBS000 三、传输请求 四、DEBUG 一、前言 本章内容分为上下两篇,包括验证和替代, 上篇:验证步骤、传输验证请求、DEBUG 下篇&#xf…...

鸿蒙小案例---心情日记

效果演示 代码实现 import { router, window } from kit.ArkUIEntry Component struct Index {async aboutToAppear(): Promise<void> {let w await window.getLastWindow(getContext())w.setWindowSystemBarProperties({statusBarColor: #00C6C3,statusBarContentColo…...

一种单脉冲雷达多通道解卷积前视成像方法【论文阅读】

一种单脉冲雷达多通道解卷积前视成像方法-李悦丽-2007 1. 论文的研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文提出的思路、方法及模型2.1 多通道解卷积(MCD)技术的核心思想2.1.1 数学模型与公式推导2.1.2 针对单脉冲雷达的改进2.2 方法与传统技术的对比3. 实…...

React中使用dnd-kit实现拖拽排序

使用dnd-kit实现拖拽排序 效果展示 实现源码 安装依赖 dad-kit github地址 yarn add dnd-kit/core dnd-kit/sortable dnd-kit/utilities dnd-kit/modifiers这几个包的作用 dnd-kit/core&#xff1a;核心库&#xff0c;提供基本的拖拽功能。dnd-kit/sortable&#xff1a;扩…...

深度学习总结(3)

数据批量的概念 通常来说&#xff0c;深度学习中所有数据张量的第一个轴&#xff08;也就是轴0&#xff0c;因为索引从0开始&#xff09;都是样本轴[samples axis&#xff0c;有时也叫样本维度&#xff08;samples dimension&#xff09;​]​。深度学习模型不会一次性处理整个…...

Android Studio Narwhal | 2025.1.1新功能

Android Studio 中的 Gemini 支持多模式图像附件 现在&#xff0c;您可以在 Android Studio 中将图像直接附加到 Gemini 提示中。您可以即时获取复杂技术图表的洞察&#xff0c;或使用设计模型生成相应的代码框架。这种将视觉环境无缝集成到 AI 辅助工作流程中的设计方式&…...

XML语法指南——从入门到精通

1、引言 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;它被设计为具有自我描述性且易于理解。本文将全面介绍XML的语法规则&#xff0c;包括元素、属性、命名规则、转义字符等核心概念。 2、XML文档基本结构 一个完整的XML文档…...

利用高阶函数实现AOP

如大家所熟悉的&#xff0c;AOP&#xff08;面向切面编程&#xff09;的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来&#xff0c;这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等。 把这些功能抽离出来之后&#xff0c;再通过“动态织入”的方式掺…...

原生SSE实现AI智能问答+Vue3前端打字机流效果

实现流程&#xff1a; 1.用户点击按钮从右侧展开抽屉&#xff08;drawer&#xff09;&#xff0c;打开模拟对话框 2.用户输入问题&#xff0c;点击提问按钮&#xff0c;创建一个SSE实例请求后端数据&#xff0c;由于SSE是单向流&#xff0c;所以每提一个问题都需要先把之前的实…...

windows11下pytorch(cpu)安装

先装anaconda 见最下方 Pytorch 官网&#xff1a;PyTorch 找到下图&#xff08;不要求版本一样&#xff09;&#xff08;我的电脑是集显&#xff08;有navdia的装gpu&#xff09;&#xff0c;装cpu&#xff09; 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…...

C++【string类】(一)

string类 1.为什么要学string&#xff1f;2.标准库类型的string类2.1 string类的构造2.2string类的析构2.3读写string类2.4string类的赋值重载2.5string的遍历 1.为什么要学string&#xff1f; 在C语言中字符出串是以‘/0’结尾的一些字符的结合&#xff0c;为了操作方便&…...

yarn:error Error: certificate has expiredERR_OSSL_EVP_UNSUPPORTED解决

yarn&#xff1a;error Error: certificate has expired 报错 error Error: certificate has expiredat TLSSocket.onConnectSecure (node:_tls_wrap:1679:34)at TLSSocket.emit (node:events:519:28)at TLSSocket._finishInit (node:_tls_wrap:1078:8)at ssl.onhandshakedon…...

Git Cherry-pick:核心命令、实践详解

Git Cherry-pick&#xff1a;核心命令、实践详解 一、Cherry-pick 1. 简介 在多分支协作开发中&#xff0c;我们常常只想把某个分支上的单个或若干次提交&#xff0c;合并到另一个分支&#xff0c;而不需要合并整个分支。Git 提供的 cherry-pick 命令&#xff0c;正是为此而…...

ffmpeg播放音视频流程

文章目录 &#x1f3ac; FFmpeg 解码播放流程概览&#xff08;以音视频文件为例&#xff09;1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包&#xff08;Packet&#xff09;5️⃣ 解码成帧&#xff08;Frame&#xff09;6️⃣ 播放 / …...

OSPF的数据报文格式【复习篇】

OSPF协议是跨层封装的协议&#xff08;跨四层封装&#xff09;&#xff0c;直接将应用层的数据封装在网络层协议之后&#xff0c;IP协议包中协议号字段对应的数值为89 OSPF的头部信息&#xff1a; 所有的数据共有的信息字段 字段名描述版本当前OSPF进程使用的版本&#xff08;…...

Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-04)

文章目录 每日一句正能量第4章 Spark SQL结构化数据文件处理章节概要4.4 RDD转换DataFrame4.4.1 反射机制推断Schema4.4.2 编程方式定义Schema 每日一句正能量 一个人若想拥有聪明才智&#xff0c;便需要不断地学习积累。 第4章 Spark SQL结构化数据文件处理 章节概要 在很多情…...

设计模式 --- 状态模式

状态模式​​是一种​​行为型设计模式​​&#xff0c;允许对象在内部状态改变时动态改变其行为​​&#xff0c;使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类​​&#xff0c;消除复杂的条件分支语句&#xff0c;提升代码的可维护性和扩展性。 状态模式的…...

将外网下载的 Docker 镜像拷贝到内网运行

将外网下载的 Docker 镜像拷贝到内网运行&#xff0c;可以通过以下步骤实现&#xff1a; 一、在有外网访问权限的机器上操作 下载镜像 使用docker pull命令下载所需的镜像。例如&#xff0c;如果你需要下载一个名为nginx的镜像&#xff0c;可以运行以下命令&#xff1a;docke…...

Seq2Seq - GRU补充讲解

nn.GRU 是 PyTorch 中实现门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模块。GRU 是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;用于处理序列数据&#xff0c;能够更好地捕捉长距离依赖关系。 ⭐重点掌握输入输出部分输入张量&#…...

从0到1构建工具站 - day6 (在线编程工具-docker)

从0到1构建工具站 网页在线编程工具构建&#xff08;php、go、python&#xff09;搜集其他在线编程网站构建php8运行环境Dockerfiledocker-compose.yaml 构建python运行环境Dockerfiledocker-compose.yml 核心调用python的docker-sdk包执行命令执行文件流程执行命令流程pythonp…...

C++面向对象编程优化实战:破解性能瓶颈,提升应用效率

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c;能熟练应用常用数据库SQL server,Oracle…...

JavaWeb 课堂笔记 —— 06 Maven

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…...

【Linux】网络层协议 IP

网络层协议 IP 一. 基本概念二. IP 协议格式三. 网段划分 (重点)1. 传统方法2. 子网掩码 四. 特殊 IP 地址五. IP 地址的数量限制六. 私有 IP 地址和公网 IP 地址七. 运营商1. 基本网络情况2. 全球网络情况 八. 路由九. IP 报文的分片和组装 网络层&#xff1a;在复杂的网络环境…...