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

Python星球日记 - 第16天:爬虫基础(仅学习使用)

🌟引言

上一篇:Python星球日记 - 第15天:综合复习(回顾前14天所学知识)

名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》)
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

    • 一、爬虫的概念与原理
      • 1. 什么是网络爬虫
      • 2. 爬虫的工作原理
      • 3. 爬虫的法律和道德考量⚠️
    • 二、使用 requests 库获取网页数据
      • 1. `requests`库介绍
      • 2. 发送GET请求
      • 3. 处理响应内容
      • 4. 设置请求头和参数
    • 三、使用 BeautifulSoup 解析HTML
      • 1. BeautifulSoup简介
      • 2. 安装和导入
      • 3. 解析HTML文档
      • 4. 选择和提取元素
    • 四、实战练习:爬取网站标题列表
      • 1. 目标分析
      • 2. 编写爬虫代码
      • 3. 运行和结果分析
      • 4. 优化和扩展
    • 五、练习(仅学习用途)
    • 六、总结
    • 参考资源

专栏介绍: Python星球日记专栏介绍(持续更新ing)
更多Python知识,请关注我、订阅专栏《 Python星球日记》,内容持续更新中…

欢迎来到Python星球🪐的第16天!

在学习完Python基础知识并进行了复习后,我们今天将探索一个非常实用的Python应用领域:网络爬虫。通过今天的学习,你将了解如何使用Python抓取互联网上的数据,这是数据分析、人工智能和自动化任务的重要基础。

一、爬虫的概念与原理

1. 什么是网络爬虫

网络爬虫(Web Crawler)是一种自动获取网页内容的程序。它可以访问互联网上的网页,获取其中的数据,并根据需要进行分析和存储。爬虫就像是我们派出去的"数字蜘蛛",它们在互联网的"网络"上爬行,收集我们需要的信息。

在这里插入图片描述

2. 爬虫的工作原理

爬虫的基本工作原理可以概括为以下几个步骤:

  1. 发送请求:爬虫向目标网站发送HTTP请求,就像我们在浏览器中输入网址一样。
  2. 获取响应:服务器返回响应,通常包含HTML、JSON或其他格式的数据。
  3. 解析数据:爬虫解析获取到的数据,提取出需要的信息。
  4. 数据处理:对提取的数据进行清洗、转换和存储
  5. 应用数据:将处理后的数据用于分析、展示或其他用途。

在这里插入图片描述

3. 爬虫的法律和道德考量⚠️

在进行网络爬虫活动时,我们需要注意以下几点🌟

  • 尊重robots.txt:许多网站都有一个名为robots.txt的文件,用于告诉爬虫哪些页面可以访问,哪些不能。
  • 控制请求频率:过于频繁的请求可能会给服务器带来负担,甚至被误认为是DoS攻击(拒绝服务攻击)。
  • 遵守法律法规:不要爬取受版权保护的内容或个人隐私数据。
  • 注意使用条款:某些网站在使用条款中明确禁止爬虫活动。

二、使用 requests 库获取网页数据

1. requests库介绍

requests是Python中最受欢迎的 HTTP客户端库 ,它使得发送HTTP请求变得简单而直观。该库的设计理念是"为人类准备的HTTP库",因此使用起来非常友好。

首先,我们需要安装requests库:

pip install requests

2. 发送GET请求

使用requests库发送GET请求非常简单:

import requests# 发送GET请求
response = requests.get('https://www.example.com')# 检查请求是否成功
if response.status_code == 200:print('请求成功!')
else:print(f'请求失败,状态码: {response.status_code}')

例如,访问 www.baidu.com,向百度搜索主页发送GET请求

import requests# 发送GET请求
response = requests.get('https://www.baidu.com')# 检查请求是否成功
if response.status_code == 200:print('请求成功!')
else:print(f'请求失败,状态码: {response.status_code}')

可以看到,“请求成功!”,说明我们向百度搜索主页发送成功了请求。

在这里插入图片描述

3. 处理响应内容

成功发送请求后,我们可以通过多种方式访问响应内容

import requestsresponse = requests.get('https://www.example.com')# 获取响应文本
html_content = response.text# 获取二进制内容(如图片)
binary_content = response.content# 如果响应是JSON格式,可以直接获取JSON数据
if 'application/json' in response.headers.get('Content-Type', ''):json_data = response.json()print(json_data)

例如,访问 www.baidu.com,向百度获取响应文本

import requestsresponse = requests.get('https://www.baidu.com')# 检查请求是否成功
if response.status_code == 200:print('请求成功!')
else:print(f'请求失败,状态码: {response.status_code}')# 获取响应文本
html_content = response.text# 获取二进制内容(如图片)
binary_content = response.content# 如果响应是JSON格式,可以直接获取JSON数据
if 'application/json' in response.headers.get('Content-Type', ''):json_data = response.json()print(json_data)

可以看到,“请求成功!”,说明我们向百度搜索主页发送成功了请求,但没有显示JSON数据,这说明中间存在某种机制在阻挡着。

在这里插入图片描述

这种机制是 反爬虫措施,会拒绝不像普通浏览器的请求。

那为什么会出现这个问题? 可能是因为:

  1. 缺少浏览器标识:网站可以检测到您的请求不是来自常规浏览器
  2. 反爬虫机制:大型网站如百度有复杂的反爬虫系统
  3. 重定向处理:网站可能将您重定向到其他页面而不直接返回内容

该怎么解决呢?我们可以设置一下请求头事实。

4. 设置请求头和参数

有时我们需要自定义请求头或传递参数:

import requests# 设置请求头,模拟真实浏览器
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','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive'
}try:# 发送带有浏览器标识的请求response = requests.get('https://www.baidu.com', headers=headers, timeout=10)# 检查请求是否成功print(f'状态码: {response.status_code}')# 查看请求是否被重定向if response.history:print(f'请求被重定向了 {len(response.history)} 次')print(f'最终URL: {response.url}')# 获取部分响应头信息print(f'内容类型: {response.headers.get("Content-Type", "未知")}')print(f'内容长度: {response.headers.get("Content-Length", "未知")}')# 检查内容if response.text:print(f'响应长度: {len(response.text)} 字符')print('前100个字符预览:')print(response.text[:100])else:print('没有获取到文本内容')# 检查是否有内容编码可能影响解析if response.encoding:print(f'内容编码: {response.encoding}')# 显示所有cookiesprint('Cookies:')for cookie in response.cookies:print(f'  {cookie.name}: {cookie.value}')except requests.exceptions.RequestException as e:print(f'请求异常: {e}')

之后我们就能看到获取到的响应内容了。

在这里插入图片描述

三、使用 BeautifulSoup 解析HTML

1. BeautifulSoup简介

BeautifulSoup是一个强大的 HTML和XML解析库,它可以将HTML文档转换成树形结构,方便我们提取需要的信息。

在这里插入图片描述

2. 安装和导入

首先,我们需要安装 BeautifulSoup 库和一个解析器(这里使用lxml):

pip install beautifulsoup4 lxml

然后在代码中导入:

import requests
from bs4 import BeautifulSoup

3. 解析HTML文档

获取网页内容后,我们可以使用 BeautifulSoup 进行解析:

import requests
from bs4 import BeautifulSoup# 获取网页内容
response = requests.get('https://www.example.com')
html_content = response.text# 创建BeautifulSoup对象
soup = BeautifulSoup(html_content, 'html.parser')# 打印格式化后的HTML
print(soup.prettify())

同样地,访问 www.baidu.com,我们借助 BeautifulSoup 来解析HTML文档

import requests
from bs4 import BeautifulSoup# 获取网页内容
response = requests.get('https://www.baidu.com')
html_content = response.text# 使用内置的 html.parser
soup = BeautifulSoup(html_content, 'html.parser')# 打印格式化后的HTML
print(soup.prettify())

可以看到,终端处已经出现了格式化后的HTML

在这里插入图片描述

补充一点:解析器选择建议

对于网络爬虫和大多数 Web 开发工作:

  • 如果性能和准确性是优先事项,安装并使用 lxml
  • 如果只是简单脚本或不想有外部依赖,使用内置的 html.parser
  • 如果需要处理非常复杂或格式不规范的 HTML,考虑安装 html5lib

4. 选择和提取元素

BeautifulSoup提供了多种方法来选择和提取HTML元素:

import requests
from bs4 import BeautifulSoup# 设置请求头,模拟浏览器
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'
}try:# 发送请求获取网页内容response = requests.get('https://www.baidu.com', headers=headers)# 检查请求是否成功if response.status_code == 200:# 打印响应内容的前100个字符,帮助诊断print("响应内容预览: ", response.text[:100])# 解析HTMLsoup = BeautifulSoup(response.text, 'lxml')# 安全地获取元素 - 方法一:使用条件判断if soup.title:title_text = soup.title.textprint(f"网页标题: {title_text}")else:print("网页中没有找到<title>标签")# 安全地获取元素 - 方法二:使用.get()方法获取属性first_paragraph = soup.find('p')if first_paragraph:paragraph_text = first_paragraph.textprint(f"第一个段落: {paragraph_text}")else:print("网页中没有找到<p>标签")# 安全地获取元素 - 方法三:使用try-except捕获可能的错误try:first_link = soup.find('a')if first_link:link_href = first_link.get('href', '无链接')  # 使用get方法提供默认值print(f"第一个链接: {link_href}")else:print("网页中没有找到<a>标签")except Exception as e:print(f"处理链接时出错: {e}")# 方法四:链式调用与默认值结合content_div_text = soup.select_one('div.content').text if soup.select_one('div.content') else "未找到内容区块"print(f"内容区块: {content_div_text}")else:print(f"请求失败,状态码: {response.status_code}")except Exception as e:print(f"程序执行出错: {e}")

访问 www.baidu.com,我们来选择和提取元素,可以看到,我们已经提取到了我们要找的元素。

在这里插入图片描述

四、实战练习:爬取网站标题列表

现在,让我们将学到的知识应用到实际案例中:爬取CSDN首页的文章标题列表。

1. 目标分析

我们的目标是爬取百度新闻首页(https://news.baidu.com/)的文章标题。在开始编写代码前,我们可以通过浏览器的开发者工具检查页面结构,找出包含标题的HTML元素。

2. 编写爬虫代码

import requests
from bs4 import BeautifulSoup
import time# 设置请求头,模拟浏览器访问
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'
}# 发送请求获取百度新闻页面的内容
url = 'https://news.baidu.com/'
response = requests.get(url, headers=headers)# 检查请求是否成功
if response.status_code == 200:# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(response.text, 'lxml')# 查找所有文章标题元素# 注意:以下选择器可能需要根据实际网页结构调整title_elements = soup.select('a.title')# 提取并打印标题print(f"共找到 {len(title_elements)} 篇文章")for i, title in enumerate(title_elements, 1):print(f"{i}. {title.text.strip()}")# 适当延时,避免请求过快if i % 5 == 0 and i < len(title_elements):time.sleep(0.5)
else:print(f"请求失败,状态码: {response.status_code}")

我们可以看到,并没有获取到百度新闻的文章列表,此时我们需要考虑其它方案来解决。

在这里插入图片描述

3. 运行和结果分析

运行上面的代码,你应该能看到百度新闻页面的文章标题列表。如果遇到问题,可能是因为网站结构发生了变化,需要调整选择器。

4. 优化和扩展

我们可以对代码进行一些优化和扩展:

import requests
from bs4 import BeautifulSoup
import csvdef crawl_with_requests():headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9'}try:# 尝试访问本地或国内网站,可能更容易成功url = 'https://news.baidu.com/'  # 例如使用百度新闻response = requests.get(url, headers=headers, timeout=20)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')# 获取新闻标题articles = []news_links = soup.select('.hotnews a, .ulist a')for link in news_links:title = link.text.strip()href = link.get('href', '')if title and href and len(title) > 5:articles.append({'title': title,'link': href})# 保存结果with open('news_titles.csv', 'w', encoding='utf-8', newline='') as f:writer = csv.DictWriter(f, fieldnames=['title', 'link'])writer.writeheader()writer.writerows(articles)print(f"成功爬取 {len(articles)} 条新闻标题,已保存到 news_titles.csv")except Exception as e:print(f"发生错误: {e}")import tracebacktraceback.print_exc()if __name__ == "__main__":crawl_with_requests()

在这里插入图片描述

在这里插入图片描述

这个优化版本增加了:

  • 异常处理:捕获各种可能的异常
  • 超时设置:防止请求长时间等待
  • 数据存储:将结果保存为CSV文件
  • 功能封装:将爬虫代码封装为函数

五、练习(仅学习用途)

  1. 修改本文提供的代码,爬取你喜欢的技术博客网站的文章标题和发布日期。
  2. 尝试使用requestsBeautifulSoup爬取一个简单的图片网站,并将图片保存到本地。
  3. 研究CSDN的robots.txt文件,了解该网站对爬虫的规定。
  4. 思考:如何爬取需要登录才能访问的网页内容?

六、总结

今天,我们学习了网络爬虫的基本概念和原理,掌握了使用requests库获取网页数据和BeautifulSoup解析HTML的方法。通过实战练习,我们成功爬取了百度新闻的文章标题列表。

爬虫的知识还有很多,本篇仅入门了解,详细地大家可以查看官方文档使用,谢谢理解。

网络爬虫是一个强大的工具,它可以帮助我们自动化数据收集过程,为数据分析和机器学习提供原材料。然而,我们也要记住,务必注意!!!使用爬虫时需要遵守法律法规和网站的使用条款,尊重数据提供者的权益!

在接下来的学习中,我们将深入探索更多方向的基础知识,敬请期待《Python星球日记》的后续内容!

参考资源

  1. requests官方文档:https://requests.readthedocs.io/
  2. BeautifulSoup官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
  3. 《Python网络数据采集》—— Ryan Mitchell 著
  4. 网络爬虫与信息提取:https://www.icourse163.org/course/BIT-1001870001

祝你在Python爬虫的旅程中收获满满!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!

相关文章:

Python星球日记 - 第16天:爬虫基础(仅学习使用)

&#x1f31f;引言&#xff1a; 上一篇&#xff1a;Python星球日记 - 第15天&#xff1a;综合复习&#xff08;回顾前14天所学知识&#xff09; 名人说&#xff1a;不要人夸颜色好&#xff0c;只留清气满乾坤&#xff08;王冕《墨梅》&#xff09; 创作者&#xff1a;Code_流苏…...

【回眸】Linux 内核 (十四)进程间通讯 之 信号量

前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...

Python 字典和集合(字典的变种)

本章内容的大纲如下&#xff1a; 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响&#xff08;什么样的数据类型可作为键、不可预知的 顺序&#xff0c;等等&#xff09; 字典的变种 这一节总结了…...

LeetCode】寻找重复子树:深度解析与高效解法

&#x1f4d6; 问题描述 给定一棵二叉树的根节点 root &#xff0c;返回所有重复的子树。若两棵树结构相同且节点值相同&#xff0c;则认为它们是重复的。对于同类重复子树&#xff0c;只需返回其中任意一棵的根节点。 &#x1f330; 示例解析 示例1 输入&#xff1a; 1/ …...

[蓝桥杯] 挖矿(CC++双语版)

题目链接 P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷 题目理解 我们可以将这道题中矿洞的位置理解成为一个坐标轴&#xff0c;以题目样例绘出坐标轴&#xff1a; 样例&#xff1a; 输入的5为矿洞数量&#xff0c;4为可走的步数。第二行输入是5个矿洞的坐标。输出结果为在要求步数…...

Appium如何实现移动端UI自动化测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用A…...

在集合中哪些可以为null,哪些不能为null;Java 集合中 null 值允许情况总结与记忆技巧

Java 集合中 null 值允许情况总结与记忆技巧 一、核心集合对 null 的支持情况 集合类型Key 是否可为 nullValue 是否可为 null原因/备注HashMap✅ 是✅ 是对 null key 有特殊处理&#xff08;存放在数组第 0 个位置&#xff09;LinkedHashMap✅ 是✅ 是继承自 HashMapTreeMap…...

Python 并发编程指南:协程 vs 多线程及其他模型比较

Python 并发编程指南&#xff1a;协程 vs 多线程及其他模型比较 并发编程是指在单个程序中同时处理多个任务的能力&#xff0c;这些任务可以交替进行&#xff08;同一时刻并不一定真的同时运行&#xff09;&#xff0c;而并行则强调在同一时刻真正同时运行多个任务&#xff08…...

WPS JS宏编程教程(从基础到进阶)-- 第五部分:JS数组与WPS结合应用

目录 摘要第5章 JS数组与WPS结合应用5-1 JS数组的核心特性核心特性解析5-2 数组的两种创建方式(字面量与扩展操作符)1. 字面量创建2. 扩展操作符创建5-3 数组创建应用:提取字符串中的数字需求说明代码实现5-4 用函数创建数组(new Array、Array.of、Array.from)1. new Arra…...

STM32定时器完全指南:从基础原理到高级应用 | 零基础入门STM32第九十六步

主题内容教学目的/扩展视频TIM定时器重点课程定时器&#xff0c;捕获器&#xff0c;比较器&#xff0c;PWM&#xff0c;单脉冲。高级TIM。定时器中断。了解TIM使用 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、定时器核心原理1.1 硬件架构解析1.2 核心参数公式…...

Kafka分区机制详解:原理、策略与应用

#作者&#xff1a;张桐瑞 文章目录 一、分区的作用二、分区策略&#xff08;一&#xff09;轮询策略&#xff08;二&#xff09;随机策略&#xff08;三&#xff09;按消息键保序策略 三、实际案例&#xff1a;消息顺序问题的解决四、其他分区策略&#xff1a;基于地理位置的分…...

最小K个数

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…...

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…...

音视频生命探测仪,救援现场的“视听先锋”|鼎跃安全

地震等自然灾害的突发性和破坏性对人类生命构成严重威胁。据统计&#xff0c;地震后的“黄金72小时”内&#xff0c;被困者的存活率随时间的推移急剧下降&#xff0c;因此快速、精准的搜救技术至关重要。 传统搜救手段依赖人耳识别呼救声或手动挖掘&#xff0c;效率低且易造成二…...

Arch视频播放CPU占用高

Arch Linux配置视频硬件加速 - DDoSolitary’s Blog 开源神器&#xff1a;加速你的视频体验 —— libvdpau-va-gl-CSDN博客 VDPAU&#xff08;Video Decode and Presentation API for Unix&#xff09; VA-API&#xff08;Video Acceleration API&#xff09; OpenGL 我的电…...

Python技巧:二维列表 和 二维矩阵 的区别

np.vstack 是 NumPy 中的一个函数&#xff0c;用于将多个数组沿垂直方向&#xff08;行方向&#xff09;堆叠。它可以处理 二维列表 和 二维矩阵&#xff0c;但它们之间有一些关键区别。以下是详细说明&#xff1a; 1. 二维列表 定义: 二维列表是 Python 原生的数据结构&#x…...

Linux 命令清单(Linux Command List)

测试人员必备的 Linux 命令清单文件管理 ls —— 显示目录内容。 ls -l 使用 -l 选项查看详细信息。 cd —— 改变当前工作目录。 cd /path/to/directory mkdir —— 创建新目录。 mkdir new_directory rm —— 删除文件或目录。 rm filename rm -r directory 使用 …...

Wallaby‘s: Nightmare (v1.0.2)靶场渗透

Wallabys: Nightmare (v1.0.2) 来自 <Wallabys: Nightmare (v1.0.2) ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23…...

java基础 可拆分迭代器 Spliterator<T>

Spliterator Spliterator介绍核心方法tryAdvanceforEachRemainingtrySplitestimateSizetrySplit 结合并行流&#xff08;Parallel Stream&#xff09;关键注意事项总结 Spliterator介绍 Spliterator&#xff08;Splittable Iterator&#xff09;是 Java 8 引入的接口&#xff…...

【AI提示词】决策专家

提示说明 决策专家可以帮助你进行科学决策&#xff0c;尽可能避免错误&#xff0c;提升决策成功的概率。 提示词 # Role : 决策专家决策&#xff0c;是面对不容易判断优劣的几个选项&#xff0c;做出正确的选择。说白了&#xff0c;决策就是拿个主意。决策专家是基于科学决策…...

VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理

VectorBT量化入门系列&#xff1a;第二章 VectorBT核心功能与数据处理 本教程专为中高级开发者设计&#xff0c;系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标&#xff0c;深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略…...

Spring Boot 配置文件加载优先级全解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 配置文件加载优先级全解析 Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置&#xff08;Externaliz…...

System V 信号量:控制进程间共享资源的访问

System V 信号量&#xff1a;控制进程间共享资源的访问 在多进程操作系统中&#xff0c;当多个进程需要共享资源时&#xff0c;必须确保对资源的访问是有序的&#xff0c;以避免竞争条件&#xff08;Race Condition&#xff09;和数据不一致性问题。System V 信号量&#xff0…...

海运货代系统哪家好?能解决了哪些常见管理难题?

随着跨境电商的迅速发展&#xff0c;货代行业在全球供应链中扮演着越来越重要的角色。随着市场需求的多样化和国际运输环境的复杂化&#xff0c;货代企业面临的挑战也愈发复杂。为了应对这些挑战&#xff0c;数字化管理工具成为货代行业不可或缺的一部分。如今先进的海运货代系…...

预测性维护+智能优化:RK3568的储能双保险

在碳中和目标推动下&#xff0c;储能行业正经历前所未有的发展机遇。作为储能系统的核心组件&#xff0c;储能柜的智能化水平直接影响着整个系统的效率和安全性。RK3568智慧边缘控制器凭借其强大的计算能力、丰富的接口和高效的能源管理特性&#xff0c;正在成为工商储能柜的&q…...

蓝桥20257-元宵分配

#include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; int main() {// 请在此输入您的代码//将强其中的一碗全部倒进另一个中&#xff0c;将所有汤圆排序&#xff0c;最后选择前&#xff08;N/2&#xff09;…...

How to connect a mobile phone to your computer?

How to connect a mobile phone to your computer? 1. Background /ˈbkɡraʊnd/2. How to connect a mobile phone to your computer?References 1. Background /ˈbkɡraʊnd/ Let me introduce the background first. Today we will talk about this topic: How to conn…...

【力扣刷题实战】全排列II

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a;全排列II 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C&#xff09; 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#xff1a;小卡…...

题目练习之map的奇妙使用

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

Excel 日期值转换问题解析

目录 问题原因 解决方案 方法1&#xff1a;使用 DateTime.FromOADate 转换 方法2&#xff1a;处理可能为字符串的情况 方法3&#xff1a;使用 ExcelDataReader 时的处理 额外提示 当你在 Excel 单元格中看到 2024/12/1&#xff0c;但 C# 读取到 45627 时&#xff0c;这是…...

Linux--文件系统

ok&#xff0c;上次我们提到了硬件和inode&#xff0c;这次我们继续学习文件系统 ext2文件系统 所有的准备⼯作都已经做完&#xff0c;是时候认识下文件系统了。我们想要在硬盘上存储文件&#xff0c;必须先把硬盘格式化为某种格式的文件系统&#xff0c;才能存储文件。文件系…...

2025 年福建交安安全员考试:结合本省交通特点备考​

福建地处东南沿海&#xff0c;交通建设具有独特特点&#xff0c;这对交安安全员考试备考意义重大。在桥梁建设方面&#xff0c;由于面临复杂的海洋环境&#xff0c;桥梁的防腐、防台风等安全措施成为重点。考生在学习桥梁施工安全知识时&#xff0c;要特别关注福建本地跨海大桥…...

【项目管理】第6章 信息管理概论 --知识点整理

项目管理 相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

python-leetcode 66.寻找旋转排序数组中的最小值

题目&#xff1a; 已知一个长度为n的数组&#xff0c;预先按照升序排列&#xff0c;经由1到n次旋转后&#xff0c;得到输入数组&#xff0c;例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若…...

WinMerge下载及使用教程(附安装包)

文章目录 一、WinMerge安装步骤1.WinMerge下载&#xff1a;2.解压&#xff1a;3.启动&#xff1a; 二、WinMerge使用步骤1.添加文件或文件夹2.查看差异3.格式选择 WinMerge v2.16.36 是一款免费开源的文件与文件夹比较、合并工具&#xff0c;能帮您快速找出差异&#xff0c;提高…...

Codeforces Round 1011 (Div. 2)

Dashboard - Codeforces Round 1011 (Div. 2) - Codeforces Problem - B - Codeforces 题目大意&#xff1a; 给你一个数组&#xff0c;你可以用一段子序列中没有出现的最小非负整数,替换数组中的组序列&#xff0c;经过若干操作&#xff0c;让数组变为长度为1&#xff0c;值…...

深度学习实战105-利用LSTM+Attention模型做生产车间中的铝合金生产时的合格率的预测应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战105-利用LSTM+Attention模型做生产车间中的铝合金生产时的合格率的预测应用。 本项目利用LSTM+Attention模型对铝合金生产合格率进行预测,不仅在理论上具有创新性和可行性,而且在实际应用中也具有重要的价值和广阔的应用前…...

苹果内购支付 Java 接口

支付流程&#xff0c;APP支付成功后 前端调用后端接口&#xff0c;后端接口将前端支付成功后拿到的凭据传给苹果服务器检查&#xff0c;如果接口返回成功了&#xff0c;就视为支付。 代码&#xff0c;productId就是苹果开发者后台提前设置好的 产品id public CommonResult<S…...

Scrapy 是什么?Python 强大的爬虫框架详解

1. Scrapy 简介 Scrapy 是一个用 Python 编写的开源 网络爬虫框架&#xff0c;用于高效地从网站提取结构化数据。它提供了完整的爬虫开发工具&#xff0c;包括请求管理、数据解析、存储和异常处理等功能&#xff0c;适用于数据挖掘、监测和自动化测试等场景。 Scrapy 的核心特…...

一种用于基于扩散磁共振成像(MRI)的微观结构估计的外梯度与噪声调谐自适应迭代网络|文献速递-深度学习医疗AI最新文献

Title 题目 An extragradient and noise-tuning adaptive iterative network for diffusionMRI-based microstructural estimation 一种用于基于扩散磁共振成像&#xff08;MRI&#xff09;的微观结构估计的外梯度与噪声调谐自适应迭代网络 Background 背景 2.1. Advanced…...

需求的图形化分析-状态转换图

实时系统和过程控制应用程序可以在任何给定的时间内以有限的状态存在。当满足所定义的标准时&#xff0c;状态就会发生改变&#xff0c;例如在特定条件下&#xff0c;接收到一个特定的输入激励。这样的系统是有限状态机的例子。此外&#xff0c;许多业务对象&#xff08;如销售…...

3月AI论文精选十篇

1. Feature-Level Insights into Artificial Text Detection with Sparse Autoencoders[1] 核心贡献&#xff1a;通过稀疏自编码器揭示AI生成文本的检测特征&#xff0c;提出基于特征分布的鉴别方法。研究发现&#xff0c;AI文本在稀疏编码空间中呈现独特的"高频低幅"…...

【android bluetooth 框架分析 01】【关键线程 2】【bt_stack_manager_thread线程介绍】

1. bt_stack_manager_thread bt_stack_manager_thread 是蓝牙协议栈中的核心调度线程&#xff0c;负责串行化处理协议栈的生命周期事件&#xff0c;包括初始化、启动、关闭与清理操作。它确保这些状态切换在同一线程中按顺序执行&#xff0c;避免竞态和资源冲突。作为蓝牙栈的…...

GEO, TCGA 等将被禁用?!这40个公开数据库可能要小心使用了

GEO, TCGA 等将被禁用&#xff1f;&#xff01;这40个公开数据库可能要小心使用了 最近NIH公共数据库开始对中国禁用的消息闹得风风火火&#xff1a; 你认为研究者上传到 GEO 数据库上的数据会被禁用吗&#xff1f; 单选 会&#xff0c;毕竟占用存储资源 不会&#xff0c;不…...

matlab安装python API 出现Invalid version: ‘R2022a‘,

打开 setup.py 文件&#xff0c;找到设置版本号的部分 将 versionR2022a 修改为符合 Python 版本号规范的格式&#xff0c;例如 version2022.1 保存 setup.py 文件...

【ROS 通信】Services 服务通信

【ROS】Service 服务通信 前言前置操作创建一个 tutorial 功能包定义服务接口修改 CMakeLists.txt 文件修改 find_package修改 add_service_files修改 generate_messages修改 catkin_packagefind_package 和 catkin_package 修改 package.xml 文件构建 服务通信的 Python 实现服…...

25.4.8学习总结

javaFX实现倒计时 核心概念 Timeline: Timeline 是JavaFX动画API的核心类&#xff0c;用于创建动画。它可以按照指定的时间间隔&#xff08;Duration&#xff09;触发事件&#xff08;KeyFrame&#xff09;。 可以将其视为一个定时器&#xff0c;每隔一段时间执行一些操作。 …...

Android audio(6)-audiopolicyservice介绍

AudioPolicyService 是策略的制定者&#xff0c;比如某种 Stream 类型不同设备的音量&#xff08;index/DB&#xff09;是多少、某种 Stream 类型的音频数据流对应什么设备等等。而 AudioFlinger 则是策略的执行者&#xff0c;例如具体如何与音频设备通信&#xff0c;维护现有系…...

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复/开发建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据&#xff08;一&#xff09;中&#xff0c;介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识&#xff0c;本文通过分析具体合约代码…...

muduo:运行起来

Muduo 概述 Muduo 是一个用 C 编写的高性能网络库&#xff0c;由陈硕开发&#xff0c;主要用于开发 Linux 环境下的高性能网络应用程序。以下从几个方面对其进行详细介绍&#xff1a; 特点 事件驱动与非阻塞 I/O&#xff1a;Muduo 基于 Reactor 模式实现&#xff0c;使用了 …...