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

初学者如何用 Python 写第一个爬虫?

初学者如何用 Python 写第一个爬虫?

一、爬虫的基本概念

(一)爬虫的定义

爬虫,英文名为 Web Crawler,也被叫做网络蜘蛛、网络机器人。想象一下,有一个勤劳的小蜘蛛,在互联网这个巨大的蜘蛛网中穿梭。它能够模拟人类用户浏览网页的行为,自动地在网页间跳转,其主要目的就是从网页里精准地提取出我们想要的特定内容。比如说,你想知道某电商平台上某款手机的所有评论,或者某个新闻网站上关于特定主题的所有文章,爬虫就可以帮你快速获取这些信息。

(二)爬虫的主要工作流程

发送请求:依据 HTTP 协议,就像是你去商店买东西要遵循商店的规则一样,爬虫按照这个规则向目标网页发起请求。它会带着一些必要的信息,比如告诉网页它想要获取什么内容,然后得到网页的 HTML 源代码,这就像是拿到了商店给你的商品清单。例如,当你在浏览器地址栏输入一个网址并回车,浏览器就会按照 HTTP 协议向对应的服务器发送请求,获取网页内容,爬虫也是类似的原理。

解析数据:获取到的 HTML 内容就像是一团杂乱的线球,里面包含了很多我们不需要的信息。解析数据这一步就是要把这团线球理顺,精准地提取出我们真正需要的数据。比如从 HTML 代码中找到网页的标题、正文内容、图片链接等等。可以把这一步想象成从一堆杂物中挑出你需要的宝贝。

存储数据:将提取出的数据妥善保存起来,就像你把买到的宝贝放在合适的地方,方便后续进一步处理与分析。可以保存到文件中,比如常见的 txt 文本文件,也可以保存到数据库里,方便进行数据的管理、查询等操作。

(三)常用 Python 工具

requests:它是一个用于高效发送 HTTP 请求的库。使用它就像给网页发送一封 “邮件”,轻松获取网页内容。比如,你想获取百度首页的内容,使用 requests 库几行代码就能搞定。它支持多种请求方式,如 GET、POST 等,满足不同场景下的需求。

BeautifulSoup:这个库专注于解析 HTML 或 XML 数据,能把复杂的 HTML 结构转化为 Python 对象,让我们可以很方便地提取特定内容。它就像是一个专业的 “整理师”,把 HTML 代码整理得井井有条,我们可以轻松地找到自己想要的标签和内容。例如,要找到网页中的所有链接,使用 BeautifulSoup 就能快速实现。

re(正则表达式):正则表达式就像是一个强大的 “搜索工具”,可以精准匹配并提取复杂文本中的特定模式。比如,当你要从一段文本中找出所有符合邮箱格式的字符串,或者提取出所有的电话号码,正则表达式就能发挥巨大作用。它有一套自己独特的语法规则,掌握了这些规则,就能在文本处理中如鱼得水。

pandas:在数据清洗与分析方面表现出色,是处理数据的得力助手。它可以对爬取到的数据进行清洗、转换、分析等操作。例如,将爬取到的杂乱无章的数据整理成整齐的表格形式,方便进行数据分析和可视化展示。

二、环境搭建

(一)安装 Python

确保你的计算机已安装 Python,建议使用 3.7 及以上版本。如果还没有安装,别担心,这很简单。你可以前往 Python 官方网站(https://www.python.org/),在网站上找到下载按钮,根据你计算机的系统(Windows、Mac 或 Linux)选择对应的安装包进行下载。下载完成后,按照安装向导的提示一步步进行安装即可。安装过程中,记得勾选添加 Python 到系统路径选项,这样在后续使用命令行时就能更方便地调用 Python 了。

(二)安装必要库

安装好 Python 后,接下来要安装我们编写爬虫所需的库。打开命令行或终端(在 Windows 系统中可以通过搜索 “命令提示符” 找到,Mac 系统中可以在 “应用程序 - 实用工具” 中找到 “终端”)。在命令行中运行以下命令来安装所需的 Python 库:

pip install requests beautifulsoup4

这里的pip是 Python 的包管理工具,就像一个软件管家,通过它可以方便地安装、升级和卸载 Python 库。requests库用于发送 HTTP 请求,beautifulsoup4库用于解析 HTML 数据。安装过程中,命令行会显示安装进度,耐心等待安装完成即可。

三、编写第一个简单爬虫

现在,我们就来动手实现一个简单的爬虫,目标是抓取某个网页的标题与正文内容。比如说,我们以一个简单的示例网页https://example.com为例(实际使用时你可以替换为你感兴趣的网页,但要注意网页的使用条款和法律规定,确保合法合规地进行数据爬取)。

(一)完整代码示例

import requestsfrom bs4 import BeautifulSoupdef simple_crawler(url):try:# 发送HTTP请求response = requests.get(url)# 检查请求状态response.raise_for_status()# 解析HTML数据soup = BeautifulSoup(response.text, 'html.parser')# 提取网页标题title = soup.find('title').text# 提取网页正文段落paragraphs = soup.find_all('p')print(f"网页标题: {title}")print("网页内容:")# 遍历并打印段落内容for p in paragraphs:print(p.text)except requests.exceptions.RequestException as e:print(f"请求失败: {e}")url = "https://example.com"simple_crawler(url)

(二)代码逐步解析

发送 HTTP 请求

response = requests.get(url)

这一行代码使用requests.get()方法向目标网址发起 GET 请求。这里的url就是我们要爬取的网页地址。requests.get()方法会返回一个response对象,这个对象包含了网页的全部内容,其中就有我们需要的 HTML 源代码。就好比你向一个地方发送了一个请求,对方给你寄回了一个包裹,这个包裹里装着网页的信息。

  1. 检查请求状态
response.raise_for_status()

这行代码借助raise_for_status()方法来检查请求是否成功。HTTP 协议中有很多状态码,比如 200 表示请求成功,404 表示网页未找到,500 表示服务器内部错误等。如果返回的 HTTP 状态码代表错误,raise_for_status()方法就会触发异常,这样我们就能知道请求过程中出现了问题。这就像是你收到包裹后,先检查一下包裹是否完好无损,如果有问题就及时发现。

  1. 解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')

这一步使用BeautifulSoup库来解析 HTML 内容。response.text就是前面获取到的网页 HTML 源代码,'html.parser'指定使用 Python 内置的 HTML 解析器。BeautifulSoup会把 HTML 内容转化为一个便于操作的 Python 对象,就像把杂乱的物品整理分类,方便我们后续查找和提取需要的信息。

  1. 提取网页内容
title = soup.find('title').textparagraphs = soup.find_all('p')

find('title')方法用于精准定位 HTML 代码中的<title>标签,并通过.text获取标签内的文本内容,也就是网页的标题。find_all('p')方法则是提取所有的段落标签<p>,并以列表的形式呈现。这就像是在整理好的物品中,专门挑出标题和所有段落的物品。

  1. 打印结果
for p in paragraphs:print(p.text)

这部分代码通过一个循环遍历提取到的段落内容,并逐一打印每个段落的文本。这样我们就能在控制台看到网页的标题和正文内容了。就像你把挑出的段落物品一个一个拿出来展示。

四、优化爬虫功能

(一)添加请求头

有些网站很 “聪明”,会识别并阻止爬虫程序的访问。这时候,我们可以通过添加请求头来模拟浏览器的访问行为,让网站以为是真实用户在访问。比如:

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)

这里的headers就是我们设置的请求头,User - Agent字段模拟了一个 Chrome 浏览器的信息。当我们发送请求时,带上这个请求头,网站就更有可能允许我们访问。

(二)控制爬取频率

为了避免对目标网站造成过大负载,我们可以在每次请求后合理设置延时。比如:

import timedef delay_request(url):response = requests.get(url)time.sleep(2)return response

在这个函数中,使用time.sleep(2)让程序暂停 2 秒后再继续执行下一次请求。这样可以减轻目标网站的压力,也能避免因为频繁请求而被网站封禁。

(三)保存数据

将爬取到的数据妥善保存至文件或数据库中。

保存至文件

with open("output.txt", "w", encoding="utf - 8") as f:f.write(f"标题: {title}n")for p in paragraphs:f.write(p.text + "n")

这段代码使用with open()语句打开一个名为output.txt的文件,以写入模式("w"),并指定编码为utf - 8。然后将网页标题和段落内容逐行写入文件中。

  1. 保存至 CSV 文件
import csvwith open("output.csv", "w", newline="", encoding="utf - 8") as csvfile:writer = csv.writer(csvfile)writer.writerow(("段落内容"))for p in paragraphs:writer.writerow((p.text))

这里使用csv模块将数据保存为 CSV 文件。先创建一个csv.writer对象,然后写入表头"段落内容",再将每个段落内容逐行写入文件。

五、应对复杂网页

(一)动态加载网页

对于由 JavaScript 渲染的网页,requests库无法获取完整内容,因为它不会执行 JavaScript 代码。这时候我们可以选用seleniumplaywright。以selenium为例:

from selenium import webdriverurl = "https://example.com"driver = webdriver.Chrome()driver.get(url)html = driver.page_source

首先导入webdriver模块,然后创建一个Chrome浏览器驱动对象(需要提前下载对应版本的 ChromeDriver 并配置好路径)。通过driver.get(url)方法打开网页,driver.page_source可以获取到经过 JavaScript 渲染后的完整网页源代码,这样就能进一步解析和提取我们需要的数据了。

(二)处理 AJAX 请求

有些网页会通过 AJAX 请求来动态加载数据。要处理这种情况,我们需要分析网页的网络请求,找到 AJAX 请求的 URL 和参数。比如,在 Chrome 浏览器中,打开网页后按 F12 键,进入开发者工具,切换到 “Network” 选项卡,刷新网页,就能看到网页发起的所有请求。找到 AJAX 请求对应的 URL,然后使用requests库模拟发送这个请求,获取数据。例如:

ajax_url = "https://example.com/ajax - data"params = {"param1": "value1", "param2": "value2"}response = requests.get(ajax_url, params=params)data = response.json()

这里ajax_url是 AJAX 请求的 URL,params是请求参数,通过requests.get()方法发送请求,假设返回的数据是 JSON 格式,使用.json()方法将其解析为 Python 的字典或列表形式,方便进一步处理。

结语

恭喜你,勇敢的编程探险家!你已经成功迈出了用 Python 编写爬虫的第一步,这是一段充满无限可能的奇妙旅程的开始。也许在这个过程中,你遇到了一些挑战,比如代码报错、数据提取不准确,但请相信,每一次解决问题都是一次成长。

学会 Python 之后,你的世界将变得更加广阔。在数据领域,你可以轻松地从互联网上收集大量数据,进行数据分析和挖掘,发现隐藏在数据背后的规律和价值,无论是用于学术研究、商业决策还是个人兴趣项目都非常有用。在自动化办公方面,Python 爬虫可以帮你自动获取工作中需要的信息,如市场数据、行业报告等,大大提高工作效率。甚至在网络安全领域,你可以利用爬虫技术进行漏洞扫描和安全评估。所以,不要停下脚步,继续探索 Python 的世界,不断学习和实践,你会发现自己的潜力远超想象,能够创造出令人惊叹的作品。加油,未来的编程大师就是你!

相关文章:

初学者如何用 Python 写第一个爬虫?

初学者如何用 Python 写第一个爬虫&#xff1f; 一、爬虫的基本概念 &#xff08;一&#xff09;爬虫的定义 爬虫&#xff0c;英文名为 Web Crawler&#xff0c;也被叫做网络蜘蛛、网络机器人。想象一下&#xff0c;有一个勤劳的小蜘蛛&#xff0c;在互联网这个巨大的蜘蛛网中…...

基于MNIST数据集的手写数字识别(CNN)

目录 一&#xff0c;模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二&#xff0c;模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…...

QT6 源(103)篇三:阅读与注释 QPlainTextEdit,给出源代码

&#xff08;10&#xff09;关于文本处理的内容很多&#xff0c;来不及全面阅读、思考与整理。先给出类的继承图&#xff1a; &#xff08;11&#xff09;本源代码来自于头文件 qplaintextedit . h &#xff1a; #ifndef QPLAINTEXTEDIT_H #define QPLAINTEXTEDIT_H#include &…...

yocto5.2开发任务手册-7 升级配方

此文为机器辅助翻译&#xff0c;仅供个人学习使用&#xff0c;如有翻译不当之处欢迎指正 7 升级配方 随着时间的推移&#xff0c;上游开发者会为图层配方构建的软件发布新版本。建议使配方保持与上游版本发布同步更新。 虽然有多种升级配方的方法&#xff0c;但您可能需要先…...

LangPDF: Empowering Your PDFs with Intelligent Language Processing

LangPDF: Empowering Your PDFs with Intelligent Language Processing Unlock Global Communication: AI-Powered PDF Translation and Beyond In an interconnected world, seamless multilingual document management is not just an advantage—it’s a necessity. LangP…...

DDS(数据分发服务) 和 P2P(点对点网络) 的详细对比

1. 核心特性对比 维度 DDS P2P 实时性 微秒级延迟&#xff0c;支持硬实时&#xff08;如自动驾驶&#xff09; 毫秒至秒级&#xff0c;依赖网络环境&#xff08;如文件传输&#xff09; 架构 去中心化发布/订阅模型&#xff0c;节点自主发现 完全去中心化&#xff0c;节…...

TC8:SOMEIP_ETS_029-030

SOMEIP_ETS_029: echoUINT8Array16Bitlength 目的 检查当method echoUINT8Array16BitLength的参数中长度字段为16bit时,SOME/IP协议层是否能对参数进行序列化和反序列化。 对于可变长度的数组而言,必须用长度字段表示数组长度。否则接收方无法判断有效数据。 SOMEIP_ETS_02…...

Elasticsearch索引全生命周期管理指南之一

#作者&#xff1a;猎人 文章目录 一、索引常规操作二、索引mapping和别名管理 一、索引常规操作 索引数据特点&#xff1a; 索引中的数据随着时间&#xff0c;持续不断增长 按照时间序列划分索引的好处&挑战&#xff1a; 按照时间进行划分索引&#xff0c;会使得管理更加…...

本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能

在数字化浪潮席卷全球的背景下&#xff0c;中国企业正面临前所未有的转型压力与机遇。随着《数据安全法》和《个人信息保护法》的全面实施&#xff0c;以及信创产业政策的深入推进&#xff0c;研发工具链的自主可控已成为关乎企业核心竞争力的战略命题。在这一关键赛道上&#…...

ARM服务器解决方案

ARM服务器解决方案已成为异构计算领域的重要技术路径&#xff0c;其核心优势与多元化场景适配性正加速产业渗透。以下为关键要点分析&#xff1a; 一、核心优势与架构设计 能效比优化‌ ARM架构基于RISC指令集&#xff0c;单节点功耗可控制在15W以下&#xff0c;较x86架构能效…...

【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN

EEMEFN&#xff1a;Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN&#xff1a;基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术&#xff0c;旨在提升图像亮度…...

嵌入式EasyRTC音视频实时通话SDK在工业制造领域的智能巡检/AR协作等应用

一、背景 在数字化浪潮席卷全球的当下&#xff0c;远程监控与驾驶技术已深度渗透至工业巡检、智能交通等核心领域。然而&#xff0c;传统方案普遍面临实时性瓶颈、高延迟传输及交互体验匮乏等痛点&#xff0c;严重制约行业智能化转型。EasyRTC作为前沿的实时音视频通信技术&am…...

uniapp-商城-58-后台 新增商品(属性子级的添加和更新)

前面对父级属性的添加进行了分析&#xff0c;这里再来继续做属性子级的数据添加&#xff0c;包含页面逻辑以及后台处理的逻辑。当然这里还是在前面的云对象的方式进行的。 本文介绍了在云对象green-mall-sku中添加子级属性的实现过程。首先&#xff0c;通过updateChild接口处理…...

基于springboot+vue的机场乘客服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户管理 航班信…...

npm和nvm和nrm有什么区别

npm 全称&#xff1a;Node Package Manager。 作用&#xff1a; 包管理&#xff1a;用于安装、共享、分发代码&#xff0c;管理项目依赖关系。项目管理&#xff1a;创建和管理 package.json 文件&#xff0c;记录项目依赖和配置信息。脚本执行&#xff1a;运行项目中的脚本&…...

几种排序方式的C语言实现(冒泡、选择、插入、希尔等)

## 分类 存储器类型&#xff1a; - 内排序&#xff08;数据规模小 内存&#xff09; - 外排序&#xff08;数据库 磁盘&#xff09; 是否基于元素之间的比较 - 基数排序 - 其他排序&#xff1a;冒泡、选择、插入、快速、归并、希尔、堆…… 时间复杂度 - O&#…...

【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接

本文所述代码实现了一个 三维状态的扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 算法。通过生成过程噪声和观测噪声&#xff0c;对真实状态进行滤波估计&#xff0c;同时对比了滤波前后状态量的误差和误差累积分布曲线。 文章目录 简介运行结果MATLAB源代码 简介 代码分为以…...

芯片测试之X-ray测试

原理&#xff1a; X-ray是利用阴极射线管产生高能量电子与金属靶撞击&#xff0c;在撞击过程中&#xff0c;因电子突然减速&#xff0c;其损失的动能会以X-Ray形式放出。而对于样品无法以外观方式观测的位置&#xff0c;利用X-Ray穿透不同密度物质后其光强度的变化&#xff0c;…...

机器学习中的特征工程:解锁模型性能的关键

在机器学习领域&#xff0c;模型的性能往往取决于数据的质量和特征的有效性。尽管深度学习模型在某些任务中能够自动提取特征&#xff0c;但在大多数传统机器学习任务中&#xff0c;特征工程仍然是提升模型性能的关键环节。本文将深入探讨特征工程的重要性、常用方法以及在实际…...

【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(1)

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 机器学习之深度学习神经网络入门一、神经网络的起源与发展二、神经元模型&#xff08;…...

反向传播算法:神经网络的核心优化方法,一文打通任督二脉

搞神经网络训练,**反向传播(Backpropagation)**是最核心的算法。 没有它,模型就只能瞎猜参数,训练基本白搭。 这篇文章不整公式推导,不搞花架子,咱就把最关键的几个问题讲明白: 反向传播到底是干啥的? 它是怎么一步步更新参数的? 哪些坑你必须避免? 一、反向传播是…...

neo4j框架:java安装教程

安装使用neo4j需要事先安装好java&#xff0c;java版本的选择是一个犯难的问题。本文总结了在安装java和使用Java过程中遇到的问题以及相应的解决方法。 Java的安装包可以在java官方网站Java Downloads | Oracle 中国进行下载 以java 8为例&#xff0c;选择最后一行的x64 compr…...

基于React的高德地图api教程007:椭圆的绘制、编辑和删除

文章目录 7、椭圆绘制7.1 绘制椭圆7.1.1 设置圆心7.1.2 确定短半轴7.1.3 确定长半轴7.1.4 实时显示椭圆形状7.2 修改椭圆7.2.1 修改椭圆属性信息7.2.2 修改椭圆形状7.3 删除椭圆7.4 定位椭圆7.5 代码下载7.07、椭圆绘制 7.1 绘制椭圆 7.1.1 设置圆心 第一次点击地图设置圆心…...

Python多线程实战:提升并发效率的秘诀

一、前言&#xff1a;为什么需要多任务处理&#xff1f; 在实际开发中&#xff0c;我们经常需要让程序同时执行多个任务&#xff0c;例如&#xff1a; 同时下载多个文件&#xff1b;在后台运行耗时计算的同时保持界面响应&#xff1b;并发处理网络请求等。 Python 提供了多种…...

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用&#xff0c;或者在本地机器上尝试 Elastic。 多年来…...

RabbitMQ 消息模式实战:从简单队列到复杂路由(四)

模式对比与选择 各模式特点对比 简单队列模式&#xff1a;结构最为简单&#xff0c;生产者直接将消息发送到队列&#xff0c;消费者从队列中获取消息&#xff0c;实现一对一的消息传递。其优势在于易于理解和实现&#xff0c;代码编写简单&#xff0c;适用于初学者和简单业务…...

OpenCV CUDA模块中矩阵操作------归一化与变换操作

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 OpenCV 的 CUDA 模块中&#xff0c;normalize 和 rectStdDev 函数用于对矩阵进行归一化处理和基于积分图计算矩形区域的标准差。 函数介绍 …...

1Panel应用推荐:Beszel轻量级服务器监控平台

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…...

谷歌地图代理 | 使用 HTML 和矢量模式 API 更轻松地创建 Web 地图

在过去的一年里&#xff0c;谷歌对 Maps JavaScript API 进行了两项重要更新&#xff0c;以便更轻松地采用我们最新、最好的地图&#xff1a;HTML 地图和矢量模式 API。今天谷歌地图亚太区最大代理商之一的 Cloud Ace云一 为大家介绍一下更新的具体内容。 联系我们 - Cloud Ac…...

最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿

关键词&#xff1a;对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度&#xff0c;正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用&#xff0c;成为构建多模态智…...

「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库

一、概述 本篇介绍如何使用 Python 构建一个集成本地聚合搜索引擎 SearxNG 与本地知识库的双通道服务接口&#xff0c;返回标准结构化 JSON 数据&#xff0c;并用于对接智能体插件系统。该接口适用于本地 Agent 应用开发与 Dify 插件集成场景。 二、目标说明 使用 Flask 实现…...

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注&#xff1a;过程更新了很多文件&#xff0c;所有这里贴上的有些内容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我们队伍并没有获奖&#xff0c;文章内容仅供一乐。 从这次比赛&#xff0c;给出以下赛前建议 …...

【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总

HTTP/2协议特点 gRPC基于HTTP/2协议&#xff0c;原因&#xff1a; 多路复用&#xff1a;允许在同一个TCP连接上并行传输多个请求和响应&#xff0c;即多个gRPC调用可以通过同一个连接同时进行&#xff0c;避免了HTTP/1.x中常见的线头阻塞问题&#xff0c;减少了连接建立和关闭…...

mac中加载C++动态库文件

前言 需要再mac系统下运行C开发的程序&#xff0c;通过摸索&#xff0c;初步实现了一版&#xff0c;大致记录下 1. 前提准备 安装OpenCV 使用Homebrew安装OpenCV&#xff1a; brew install opencv确认安装路径&#xff1a; brew --prefix opencv默认路径为/opt/homebrew/…...

Apollo Client 1.6.0 + @RefreshScope + @Value 刷新问题解析

问题描述 在使用 Apollo Client 1.6.0 结合 Spring Cloud 的 RefreshScope 和 Value 注解时&#xff0c;遇到以下问题&#xff1a; 项目启动时第一次属性注入成功后续配置变更时&#xff0c;Value 属性会刷新&#xff0c;但总是刷新为第一次的旧值&#xff0c;而不是最新的配…...

大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

文本分类任务Qwen3-0.6B与Bert:实验见解

文本分类任务Qwen3-0.6B与Bert&#xff1a;实验见解 前言 最近在知乎上刷到一个很有意思的提问Qwen3-0.6B这种小模型有什么实际意义和用途。查看了所有回答&#xff0c;有人提到小尺寸模型在边缘设备场景中的优势&#xff08;低延迟&#xff09;、也有人提出小模型只是为了开…...

Mysql、Oracle、Sql Server、达梦之间sql的差异

1&#xff1a;分页查询 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…...

STM32外设AD-DMA+定时读取模板

STM32外设AD-DMA定时读取模板 一&#xff0c;方法引入二&#xff0c;CubeMX配置三&#xff0c;变量声明四&#xff0c;代码实现 (单通道) 一&#xff0c;方法引入 轮询法虽然简单&#xff0c;但 CPU 一直在忙着等待&#xff0c;效率太低。为了让 CPU 能在 ADC 转换的同时处理其…...

SQL里where条件的顺序影响索引使用吗?

大家好&#xff0c;我是锋哥。今天分享关于【SQL里where条件的顺序影响索引使用吗&#xff1f;】面试题。希望对大家有帮助&#xff1b; SQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 查询中&#xff0c;W…...

Java 接口中实现异步处理的方法

在Java中,接口本身不能直接实现逻辑(接口中的方法默认是抽象的,JDK 8+允许通过default方法提供非抽象实现,但通常不用于复杂的异步处理)。异步处理的逻辑需要在实现接口的类中通过多线程、异步框架或回调机制来实现。以下是几种常见的在接口实现类中实现异步处理<...

数值分析证明题

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题 第一题 例 给出 cos ⁡ x \cos x cosx&#xff0c; x ∈ [ 0 ∘ , 9 0 ∘ ] x\in[0^{\circ},90^{\circ}] x∈[0∘,90∘]的函数表&#xff0c;步长 h 1 ′ ( 1 60 ) ∘ h 1 (\frac{1}{60})^{\circ} h1′…...

深入理解二叉树:遍历、存储与算法实现

在之前的博客系列中&#xff0c;我们系统地探讨了多种线性表数据结构&#xff0c;包括顺序表、栈和队列等经典结构&#xff0c;并通过代码实现了它们的核心功能。从今天开始&#xff0c;我们将开启一个全新的数据结构篇章——树结构。与之前讨论的线性结构不同&#xff0c;树形…...

Python web 开发 Flask HTTP 服务

Flask 是一个轻量级的 Web 应用框架&#xff0c;它基于 Python 编写&#xff0c;特别适合构建简单的 Web 应用和 RESTful API。Flask 的设计理念是提供尽可能少的约定和配置&#xff0c;从而让开发者能够灵活地构建自己的 Web 应用。 https://andi.cn/page/622189.html...

【AI】用Dify实现一个模拟面试的功能

前言 Dify&#xff0c;一个将LLM转换为实际工作流的工具&#xff0c;以及火了一段时间了&#xff0c;但直到最近才开始研究它的使用&#xff08;主要前段时间在忙着自己的独立开发项目&#xff09;&#xff0c;我发现它的功能基本上满足了我对大语言模型&#xff0c;从仅对话转…...

研华服务器ASMB-825主板无法识别PCIE-USB卡(笔记本)

系统下无法识别到USB卡&#xff0c;排除硬件问题&#xff0c;系统问题。 最后在BIOS中更改此PCIE端口参数为X4X4X4X4&#xff0c;设置完成后可正常使用USB卡。 底部有问题详细解析。 针对研华主板ASMB-825安装绿联PCIE-USB卡无法识别的问题&#xff0c;结合BIOS设置调整的解决过…...

Redisson 四大核心机制实现原理详解

一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…...

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)

在云应用/服务的 5 层架构里&#xff0c;数据库服务层稳坐第 4 把交椅&#xff0c;堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏&#xff0c;不少人都将它视为整个架构中的 “终极挑战”。 不过&#xff0c;也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...

Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系

从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭&#xff0c;代码耦合得跟一团麻线似的&#xff0c;改个小功能都能牵一发而动全身&#xff1b;也可能有些团队在协作时&#xff0c;经常因为代码冲突或者职责不清搞得焦头烂额。相信我&#xff0c;这些问题我…...