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

Python爬虫使用示例-保存诗人简介到csv文件中

一、获取资源

目标网址:(第一页)

https://www.shicimingju.com/category/all

(后续)

https://www.shicimingju.com/category/all_2
https://www.shicimingju.com/category/all_3
...
https://www.shicimingju.com/category/all_652

在这里插入图片描述
作者

.cont1 .list li .infor .name

简介

.cont1 .list li .infor .text

确定爬取机制遵循 robots.txt,大多数网站都有一个 robots.txt 文件,说明了允许和禁止爬取的页面。在开始之前,检查网站的 robots.txt,确保遵循其中的规则。直接请求该文件并解析其内容,以确保爬虫符合网站的意图。

robots_url = 'https://www.shicimingju.com/robots.txt'
robots_response = requests.get(robots_url)
print(robots_response.text)  # 检查 robots.txt 的内容以遵循规则

二、发送请求

response = requests.get(url)

三、数据解析

# 解析HTML
selector = Selector(response.text)
# 获取作者名称
authors_name = selector.css('.cont1 .list li .infor .name::text').getall()
# 获取作者简介
authors_introduction = selector.css('.cont1 .list li .infor .text::text').getall()
# 清洗作者简介,去除多余的换行和空格
cleaned_introductions = [' '.join(intro.strip().replace('\n', ' ').split())for intro in authors_introduction
]

四、保存数据

# 创建DataFrame
authors_data = pd.DataFrame({'name': authors_name,'introduction': cleaned_introductions[:len(authors_name)]  # 确保长度匹配
})
# 存储到 CSV 文件,使用utf-8编码以防止乱码
authors_data.to_csv('authors_info.csv', index=False, encoding='utf-8-sig')
print("数据已成功写入 authors_info.csv")

五、实现代码

import requests
from parsel import Selector
import pandas as pd
# 目标网址
url = 'https://www.shicimingju.com/category/all'  # 替换为你要爬取的实际网址
# 发送请求
response = requests.get(url)
# 检查响应状态
if response.status_code == 200:# 解析HTMLselector = Selector(response.text)# 获取作者名称authors_name = selector.css('.cont1 .list li .infor .name::text').getall()# 获取作者简介authors_introduction = selector.css('.cont1 .list li .infor .text::text').getall()# 清洗作者简介,去除多余的换行和空格cleaned_introductions = [' '.join(intro.strip().replace('\n', ' ').split())for intro in authors_introduction]# 创建DataFrameauthors_data = pd.DataFrame({'name': authors_name,'introduction': cleaned_introductions[:len(authors_name)]  # 确保长度匹配})# 存储到 CSV 文件,使用utf-8编码以防止乱码authors_data.to_csv('authors_info.csv', index=False, encoding='utf-8-sig')print("数据已成功写入 authors_info.csv")
else:print(f"请求失败,状态码:{response.status_code}")

﹍继续优化﹍

六、非恶意化

提高程序的稳定性和隐蔽性,降低被封的风险。并确保不对目标网站造成过大负担,对个别页面的访问频率应保持合理,尽量避免对服务器产生恶意影响。防止成为恶意爬虫并规避网站的反爬虫机制,可以在爬虫代码中实施添加请求延时等策略,具体如下:

1. 增加随机延时
上面代码中使用 time.sleep(random.uniform(1, 3)) 指令在请求之间随机延迟 1 到 3 秒,进一步减小对目标网站造成的压力。

2. User-Agent 伪装
伪装请求的 User-Agent 字段,让请求看起来像是来自不同的常用浏览器,而不是一个自动化的爬虫。你可以在请求头中设定较为常见的浏览器 User-Agent。

# 随机选择一个 User-Agent
USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
]
# 创建一个 Pandas Excel 文件写入器
with pd.ExcelWriter('authors_info.xlsx', engine='openpyxl') as writer:for page in range(1, total_pages + 1):  # 从1循环到总页数(652)# 根据页码构建URLurl = 'https://www.shicimingju.com/category/all' if page == 1 else f'https://www.shicimingju.com/category/all_{page}'# 随机选取 User-Agentheaders = {'User-Agent': random.choice(USER_AGENTS)}

3. 设置请求频率
控制请求的频率可以减少被服务器识别为恶意爬虫的风险。每隔一段时间才发送请求。

4. IP 代理池
使用代理服务器可以隐藏你的真实IP地址,同时扩展可用的请求次数。你可以实现代理池,随机选择不同的代理IP发送请求。在请求头中设置HTTP代理可能效果更好:

proxies = {"http": "http://your_proxy_ip:port","https": "https://your_proxy_ip:port",
}# 在发送请求时添加 proxies 参数
response = requests.get(url, headers=headers, proxies=proxies)

5. 避免频繁请求相同页面
确保在短时间内不重复请求相同页面,可以使用缓存机制来避免反复请求已经获取的数据,也可以通过设计性爬取策略,关注不同时间段内数据的变化。

七、其他优化

1. 多线程处理
使用 concurrent.futures 模块,该模块为异步执行可调用对象提供了一个高级接口。使用 ThreadPoolExecutor 合并多线程处理,max_workers控制线程数。
2. 处理缺失的介绍信息
在 parse_authors_data 函数中,使用列表推导式来处理 authors_introduction。如果某个介绍为空(intro.strip() 结果为空),则将其替换为 ‘-’。这确保了每个作者都有对应的介绍,即使是缺失的情况。
在这里插入图片描述

3. 检查内容是否为空
检查 HTML 内容是否为空,添加了检查 html 是否为空的逻辑,以防某些请求未返回有效的网页内容。检查 DataFrame 是否为空,在写入工作表之前,确保 authors_data DataFrame 不是空的;如果是空的,打印一条信息说明未能写入。

八、优化代码

一页一sheet

import time
import random
import requests
from parsel import Selector
import pandas as pd
from concurrent.futures import ThreadPoolExecutor, as_completed# Constants
TOTAL_PAGES = 652  # Adjust as needed
MAX_RETRIES = 5
TIMEOUT = 10  # Timeout for requests
USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
]"""
# 代理列表(替换为您的代理)
PROXIES = ["http://183.164.243.143:8089","http://200.37.186.66:8080","http://183.89.247.182:8080",
]# 分析函数
def get_random_proxy():return {'http': random.choice(PROXIES), 'https': random.choice(PROXIES)}
"""def fetch_data(url):retry_count = 0while retry_count < MAX_RETRIES:headers = {'User-Agent': random.choice(USER_AGENTS)}print(f"正在请求 {url}...")  # Print the requested URLtry:response = requests.get(url, headers=headers, timeout=TIMEOUT)# response = requests.get(url, headers=headers, proxies=get_random_proxy(), timeout=TIMEOUT)response.raise_for_status()  # Raise an error for bad responsesreturn response.textexcept requests.RequestException as e:delay_time = random.uniform(2, 6)  # Random delay between retriesprint(f"请求失败,错误信息:{e},状态码:{response.status_code if 'response' in locals() else 'N/A'},等待 {delay_time:.2f} 秒后重试...")time.sleep(delay_time)retry_count += 1print("达到最大重试次数,程序结束。")return Nonedef parse_authors_data(html):selector = Selector(html)authors_name = selector.css('.cont1 .list li .infor .name::text').getall()authors_introduction = selector.css('.cont1 .list li .infor .text::text').getall()# 处理介绍信息,如果没有则填充 '-'cleaned_introductions = [' '.join(intro.strip().replace('\n', ' ').split()) if intro.strip() else '-'for intro in authors_introduction]# 确保长度匹配return pd.DataFrame({'name': authors_name,'introduction': cleaned_introductions[:len(authors_name)]})def main():with pd.ExcelWriter('authors_info.xlsx', engine='openpyxl') as writer:# Create a list of URLs to scrapeurls = ['https://www.shicimingju.com/category/all' if page == 1 else f'https://www.shicimingju.com/category/all_{page}'for page in range(1, TOTAL_PAGES + 1)]# Use ThreadPoolExecutor to fetch data concurrentlywith ThreadPoolExecutor(max_workers=10) as executor:  # You can adjust the number of workersfuture_to_url = {executor.submit(fetch_data, url): url for url in urls}for future in as_completed(future_to_url):url = future_to_url[future]try:html = future.result()if html:authors_data = parse_authors_data(html)page_number = urls.index(url) + 1  # Get the page numberauthors_data.to_excel(writer, sheet_name=str(page_number), index=False)print(f"数据已成功写入第 {page_number} 页工作表")except Exception as e:print(f"处理 {url} 时发生错误:{e}")print("所有数据已成功写入 authors_info.xlsx")if __name__ == "__main__":main()

all单sheet
将所有诗人和简介写入一个表格的一张sheet,但是前面标注page数

在这里插入图片描述
运行完之后因为前面有数字页码,所以可以进行一个简单的排序。这也是为什么不分sheet的原因,这样可以直观地看到总数,如果是几百个sheet的话,会比较杂乱。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个13035,大概是假设每页20个诗人,(最后一页15个),但实际有的页面可能没有20个
在这里插入图片描述
所以得到的会少于这个数。

import time
import random
import requests
from parsel import Selector
import pandas as pd
from concurrent.futures import ThreadPoolExecutor, as_completed# Constants
TOTAL_PAGES = 652  # Adjust as needed
MAX_RETRIES = 5
TIMEOUT = 10  # Timeout for requests
USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
]"""
# 代理列表(替换为您的代理)
PROXIES = ["http://183.164.243.143:8089","http://200.37.186.66:8080","http://183.89.247.182:8080",
]# 分析函数
def get_random_proxy():return {'http': random.choice(PROXIES), 'https': random.choice(PROXIES)}
"""def fetch_data(url):retry_count = 0while retry_count < MAX_RETRIES:headers = {'User-Agent': random.choice(USER_AGENTS)}print(f"正在请求 {url}...")  # Print the requested URLtry:response = requests.get(url, headers=headers, timeout=TIMEOUT)# response = requests.get(url, headers=headers, proxies=get_random_proxy(), timeout=TIMEOUT)response.raise_for_status()  # Raise an error for bad responsesreturn response.textexcept requests.RequestException as e:delay_time = random.uniform(2, 6)  # Random delay between retriesprint(f"请求失败,错误信息:{e},状态码:{response.status_code if 'response' in locals() else 'N/A'},等待 {delay_time:.2f} 秒后重试...")time.sleep(delay_time)retry_count += 1print("达到最大重试次数,程序结束。")return Nonedef parse_authors_data(html, page_number):selector = Selector(html)authors_name = selector.css('.cont1 .list li .infor .name::text').getall()authors_introduction = selector.css('.cont1 .list li .infor .text::text').getall()# 处理介绍信息,如果没有则填充 '-'cleaned_introductions = [' '.join(intro.strip().replace('\n', ' ').split()) if intro.strip() else '-'for intro in authors_introduction]# 创建 DataFrame,并添加页码列return pd.DataFrame({'page': [page_number] * len(authors_name),  # 添加页码列'name': authors_name,'introduction': cleaned_introductions[:len(authors_name)]})def main():all_authors_data = pd.DataFrame()  # 初始化一个空的数据框来累积数据# Create a list of URLs to scrapeurls = ['https://www.shicimingju.com/category/all' if page == 1 else f'https://www.shicimingju.com/category/all_{page}'for page in range(1, TOTAL_PAGES + 1)]# Use ThreadPoolExecutor to fetch data concurrentlywith ThreadPoolExecutor(max_workers=10) as executor:  # You can adjust the number of workersfuture_to_url = {executor.submit(fetch_data, url): url for url in urls}for future in as_completed(future_to_url):url = future_to_url[future]try:html = future.result()# Check if HTML is returned properlyif html:page_number = urls.index(url) + 1  # Get the page numberauthors_data = parse_authors_data(html, page_number)# 追加数据到总数据框all_authors_data = pd.concat([all_authors_data, authors_data], ignore_index=True)else:print(f"第 {page_number} 页的HTML内容为空。")except Exception as e:print(f"处理 {url} 时发生错误:{e}")# 将最终的所有数据写入到一个工作表中all_authors_data.to_excel('authors_info.xlsx', index=False)print("所有数据已成功写入 authors_info.xlsx")if __name__ == "__main__":main()

相关文章:

Python爬虫使用示例-保存诗人简介到csv文件中

一、获取资源 目标网址&#xff1a;&#xff08;第一页&#xff09; https://www.shicimingju.com/category/all&#xff08;后续&#xff09; https://www.shicimingju.com/category/all_2 https://www.shicimingju.com/category/all_3 ... https://www.shicimingju.com/ca…...

yocto的xxx.bb文件在什么时候会拷贝文件到build目录

在 Yocto 中&#xff0c;.bb 文件用于描述如何构建和安装一个软件包&#xff0c;而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说&#xff0c;文件会在以下几个阶段被拷贝到 build 目录&#xff08;或者更准确地说&#xff0c;拷贝到目标目录 ${D}&#x…...

Mysql定时数据库备份保姆级教程

目录 一、需要解决的问题 1、如何传输文件? 2、如何备份数据库? 3、如何建立一个定时任务? 二、实施步骤 1、建立SSH公钥&#xff0c;实现无密码登录 2、编写备份数据库脚本 3、编写定时任务 MySQL 是一种全球广泛使用的关系型数据库管理系统&#xff0c;它存储的数…...

使用 Grafana 展示多个TiDB集群的告警

作者&#xff1a; yangzhj 原文来源&#xff1a; https://tidb.net/blog/229e283c 背景 在日常运维工作中&#xff0c;我们有时需要将多个生产集群的告警信息展示在一起&#xff0c;统一集中观察和分析TiDB 集群的告警情况。 本文将通过 Grafana 的多数据源功能来将多个Ti…...

lnmp+discuz论坛 附实验:搭建discuz论坛

Inmpdiscuz论坛 Inmp: t: linux操作系统 nr: nginx前端页面 me: mysql数据库 账号密码&#xff0c;等等都是保存在这个数据库里面 p: php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#xff0c;通过php把动态请求转发到数据库 n…...

AI时代的开发新纪元:云开发 Copilot

AI时代的开发新纪元&#xff1a;云开发 Copilot 目录 引言&#xff1a;AI时代的开发新纪元低代码与AI的完美融合云开发 Copilot的革命性意义云开发 Copilot 的核心特性解析 快速生成应用功能低代码与AI的深度结合 实战演练&#xff1a;云开发 Copilot 的应用案例 从需求到实现…...

探索 Java 中的 Bug 世界

在 Java 编程的旅程中&#xff0c;我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法&#xff0c;对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。 一、Java Bug 的定义与分类…...

【C++】等差数列末项计算题解析及优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述与输入输出要求&#x1f4af;数学分析与公式推导公差的计算通项公式推导 &#x1f4af;示例解析解题步骤 &#x1f4af;程序实现与解析初版代码代码解析优点与不足…...

【LeetCode】55.跳跃游戏

文章目录 题目链接&#xff1a;题目描述&#xff1a;解题思路&#xff08;贪心算法&#xff09;&#xff1a; 题目链接&#xff1a; 55.跳跃游戏 题目描述&#xff1a; 解题思路&#xff08;贪心算法&#xff09;&#xff1a; 如果某一个位置的元素为N&#xff0c;表示后面N…...

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...

SparkSQL编程实践

文章目录 SparkSQL编程实践1.1. 编程模型介绍1.2. SparkSQL编程1.2.1. 第三方库安装1.2.2. SparkSQL程序的结构1.2.3. SparkSQL执行模式1.2.3.1. Local模式1.2.3.2. 集群模式 1.2.4. 数据加载1.2.4.1. 通过RDD创建DataFrame1.2.4.2. 通过读取数据外部数据创建DataFrame标准读取…...

模型训练数据-MinerU一款Pdf转Markdown软件

模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介&#xff1a; MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具&#xff0c;专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…...

shell基础用法

shell基础知识 shell中的多行注释 :<<EOF read echo $REPLY # read不指定变量&#xff0c;则默认写入$REPLY EOF # :<<EOF ...EOF 多行注释&#xff0c;EOF可以替换为&#xff01;# 等文件目录和执行目录 echo $0$0 # ./demo.sh echo $0的realpath$(realpath…...

Redisson分布式锁

概览 个人博客源地址 Redisson不只是一个 Java Redis 客户端&#xff0c;它是一个以内存 Redis 服务器作为后端的处理 Java 对象(如 java.util.List, java.util.Map, java.util.Set, java.util.concurrent.locks.Lock 等)的一个框架。 Redisson提供了使用Redis的最简单和最…...

【C语言--趣味游戏系列】--电脑关机整蛊小游戏

前言&#xff1a; 老铁们&#xff0c;还是那句话&#xff0c;学习很苦游戏来补&#xff0c; 为了提高大家与朋友之间的友谊&#xff0c;博主在这里分享一个电脑关机的恶作剧小游戏&#xff0c;快拿去试试吧&#xff01;&#xff01;&#xff01; 目录&#xff1a; 1.电脑关机代…...

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…...

二叉树优选算法(一)

一、根据二叉树创建字符串 题目介绍&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需…...

单片机C51--笔记8-STC89C51RC/RD-IIC协议

一、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。 特点 简单性和有效性。 由于接口直接在组件之上&#xff0c;因此IIC总线占用的空间非常小…...

HttpUtil的get和post请求

Http工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.ht…...

leetcode 二进制数转字符串

1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …...

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…...

【Linux】进程

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、冯诺依曼体系结构 &#x1f31f;系统调用和库函数概念 二、操作系统OS 三、进程 &#x1f31f;查看进程 &#x1f31f;通过系统调用获取进程标示符 &#x1f31f;通过系统调用创…...

transformers生成式对话机器人

简介 生成式对话机器人是一种先进的人工智能系统&#xff0c;它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同&#xff0c;生成式对话机器人并不局限于预定义的回答集&#xff0c;而是可以根据对话上下文动态地…...

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…...

C# 关于加密技术以及应用(二)

AES&#xff08;Advanced Encryption Standard&#xff09;和 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是两种不同的加密算法&#xff0c;它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景&#xff1a; AES&#xff08;高级加密标准&#xff09; 特…...

四十四:Web如何关闭会话

在Web应用中&#xff0c;关闭会话&#xff08;Session Termination&#xff09;是一个重要的机制&#xff0c;用于确保用户的会话状态被安全地终止。无论是用户主动退出登录还是因超时被动登出&#xff0c;正确地管理会话关闭有助于提升安全性并释放服务器资源。 一、为什么需…...

在wsl2中安装archlinux

在之前的博客中&#xff0c;我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置&#xff0c;但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利&#xff0c;在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…...

在Goland中对goroutine协程断点调试

在Goland中对goroutine协程断点调试 环境: Goland 参考了 chatgpt 的回复 进行断点调试的代码 package mainimport ("fmt""sync""time" )// worker 模拟处理任务 func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保任务完成后…...

最长连续递增序列

问题分解 1&#xff1a;要求 要求找到最长的连续递增子序列&#xff0c;即在原数组中位置连续且数值严格递增的一段序列 2&#xff1a;输入和输出 输入是一个未经排序的整数数组nums 输出是该数组中最长连续递增子序列的长度 3&#xff1a;边界调节 数组为空则长度为0 …...

apt 包 源 的维护 和缓存 命令

APT 包源维护命令 更新软件包列表&#xff1a; sudo apt update&#xff1a;从配置的软件源中获取最新的软件包信息。这是安装、升级或删除软件包前通常要执行的步骤&#xff0c;以确保使用的是最新的软件包信息。 升级软件包&#xff1a; sudo apt upgrade&#xff1a;升级系…...

【排序方法的总结】

在数据结构中常见的排序方法有&#xff1a; 插入排序、交换排序、选择排序、归并排序和基数排序等。 插入排序 特点&#xff1a; 简单直观&#xff0c;对于小规模的数据排序效率较高。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后…...

工作中常用springboot启动后执行的方法

前言&#xff1a; 工作中难免会遇到一些&#xff0c;程序启动之后需要提前执行的需求。 例如&#xff1a; 初始化缓存&#xff1a;在启动时加载必要的缓存数据。定时任务创建或启动&#xff1a;程序启动后创建或启动定时任务。程序启动完成通知&#xff1a;程序启动完成后通…...

QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能

简介 在Qt中&#xff0c;使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能&#xff0c;而不使用第三方库&#xff08;如QXlsx&#xff09;。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…...

模版方法模式的理解和实践

在软件开发中&#xff0c;设计模式为我们提供了一套经过验证的解决方案&#xff0c;用于解决常见的设计问题。其中&#xff0c;模版方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改…...

05-树莓派-交叉编译

交叉编译的概念 交叉编译是什么 来源百度百科&#xff1a; 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统&#xff1b;同样&#xff0c;同一个操作系统也可以在不同的体系结构上运行。 举例来说&#xff0c;我们常说的x86 Lin…...

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…...

非归档模式下一个或多个数据文件损坏恢复

1. 介绍 有些时侯可能你的库处于非归档的模式下&#xff0c;而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复&#xff0c;这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption&#xff0c;让数据库重生。 通过设置隐含参数恢复 alter system …...

k8s 之storageclass使用nfs动态申请PV

文章目录 配置角色权限部署nfs-client-provisioner创建 NFS StorageClass创建 PVC 来动态申请 PV在 Pod 中使用 PVC验证存储是否正确挂载使用 kubectl 和 jq 筛选 PVCwaiting for a volume to be created, either by external provisioner "nfs-diy" or manually cre…...

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...

Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…...

React学习笔记(一)

创建函数写法一&#xff1a; 重点&#xff1a;函数有几种写法 function DemoShow() {return (<div className"App">函数声明</div>); }export default DemoShow;对应js创建函数声明&#xff1a;function sum1(a,b){return ab } 创建函数写法二&#x…...

【H2O2|全栈】MySQL的基本操作(三)

目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询&#xff0c;与单表查询…...

SQL按指定字符分割字符串

在SQL中分割字符串通常需要使用特定的函数&#xff0c;因为SQL本身并不像编程语言那样直接支持字符串分割。不同的数据库系统有不同的函数来处理字符串分割。以下是一些常见数据库系统中分割字符串的方法&#xff1a; 1. MySQL 在MySQL中&#xff0c;你可以使用SUBSTRING_IND…...

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …...

喜报!极限科技(INFINI Labs)通过国家高新技术企业认定

2024 年 10 月 29 日&#xff0c;国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司 顺利通过本次高新技术企业评审&#xff0c;并获得 国家级“高新技术企业”认…...

在Ubuntu 22.04上搭建Kubernetes集群

Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes&#xff08;常简称为 K8s&#xff09;是一个强大的开源平台&#xff0c;用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation&#xff08;CNCF&#xff0…...

【OpenCV】平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

Vue了解

​​​​​​​MVVM和MVC区别是什么? MVC &#xff1a; 传统的设计模式。 设计模式&#xff1a; 一套广泛被使用的开发方式 M&#xff1a; model 模型 模型&#xff1a;就是数据的意思 V &#xff1a; view视图 视图&#xff1a;就是页面的意思 C&#xff1a;controlle…...

JS 深拷贝浅拷贝

一、浅拷贝 // 假设有一个JSON对象 let originalObject {name: "Alice",age: 25,interests: ["reading", "coding"] };// 将JSON对象赋值给另一个变量 let copiedObject originalObject;// 修改新变量的属性 copiedObject.age 26;// 输出原始…...

设计模式学习之——单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这个模式的主要目的是控制对象的创建&#xff0c;确保在程序的整个生命周期中&#xff0c;某个类只有一个实例被创…...