【Python进阶】Python中的网络爬虫策略:高效数据抓取与解析

1、网络爬虫概论与Python环境配置

1.1 网络爬虫基本概念与工作原理

网络爬虫,如同在网络世界中勤劳的蚂蚁,自动地在网络空间里穿梭游走,寻找并收集散布在网络各个角落的信息宝藏。它是一种自动化程序,遵循一定的规则,通过发送HTTP请求访问网页,并从返回的HTML、XML或其他类型的数据中提取我们需要的信息。

1.1.1 什么是网络爬虫及其重要性

想象一下,在浩瀚的互联网海洋中,数以亿计的网页构成了丰富的信息矩阵。网络爬虫就是这个矩阵中的探索者,它根据预设的规则遍历网页,将海量的分散数据聚合起来,转化为可供分析利用的知识财富。无论是新闻聚合、市场研究、还是人工智能训练数据集的构建,网络爬虫都发挥着至关重要的作用。

1.1.2 网络爬虫的基本架构与工作流程

一个典型的网络爬虫包括四个主要组成部分:请求模块负责向目标服务器发起HTTP请求;解析模块用于解析服务器返回的HTML或XML等数据;数据存储模块负责将有价值的信息存储下来;调度器则根据策略决定爬虫下一步访问哪个URL。

网络爬虫的工作流程大致如下:

**起始URL集合:**爬虫从预先设定的一组URL开始。
**发送请求:**请求模块发送HTTP请求到指定URL,获取网页内容。
**内容解析:**收到响应后,解析模块会提取出新的URL链接和需要抓取的数据。
**数据存储:**将抓取的数据保存至本地文件、数据库或其它数据存储介质。
**循环迭代:**重复上述过程,直到满足停止条件(如达到预定抓取数量、遍历完所有链接等)。

1.2 Python爬虫环境准备与基础库安装

1.2.1 安装Python及相关开发环境

为了踏上Python网络爬虫之旅,首先需要安装Python环境。推荐使用Anaconda发行版,它不仅包含了Python解释器,还内置了大量的科学计算和数据处理库。请访问Anaconda官网下载适合您操作系统的版本,并按指南完成安装。

安装完成后,可通过命令行或终端输入python --version来验证Python是否成功安装。

1.2.2 安装和配置Scrapy、Requests-HTML、BeautifulSoup等常用爬虫库

在命令行或终端中执行以下命令安装这些基础库:

pip install scrapy requests-html beautifulsoup4

安装完成后,即可在Python脚本中导入这些库,开始编写您的第一个网络爬虫。例如:

import requests_html
from bs4 import BeautifulSoup# 示例:发送GET请求并使用BeautifulSoup解析网页
response = requests_html.HTMLSession().get('https://example.com')
soup = BeautifulSoup(response.html, 'html.parser')
# 进一步从soup对象中提取所需数据...

2、Python网络爬虫基础实战

2.1 使用Requests与BeautifulSoup抓取静态网页数据

2.1.1 Requests库实现HTTP请求操作

在Python的世界中,Requests库就像一只灵敏的手臂,可以伸向全球任何一个网站,精准地抓取你需要的网页内容。让我们通过一个简单的例子来体验它的威力:

假设我们想要从一个虚构的网站 https://example-shop.com/products 获取商品列表信息,首先引入Requests库并通过以下代码发起一个GET请求:

import requests# 发送HTTP GET请求到目标网址
response = requests.get('https://example-shop.com/products')# 检查请求是否成功
if response.status_code == 200:# 若状态码为200,表示请求成功,获取网页HTML内容html_content = response.text
else:print(f"请求失败,状态码:{response.status_code}")# HTML内容现在已存储在变量html_content中,我们可以进一步处理

2.1.2 BeautifulSoup解析HTML文档获取所需信息

获得HTML内容后,BeautifulSoup就像是一个细心的园丁,帮助我们在杂乱的HTML花园中找到特定的花朵——也就是我们关心的数据节点。继续上一段代码的例子,我们现在使用BeautifulSoup解析HTML:

from bs4 import BeautifulSoup# 创建BeautifulSoup对象解析HTML内容
soup = BeautifulSoup(html_content, 'html.parser')# 假设商品列表位于类名为'product-list'的div元素下
product_list = soup.find('div', class_='product-list')# 对每个商品进行迭代(假设商品在li标签中)
for product_item in product_list.find_all('li'):# 提取商品名称(假设名称在h3标签内)product_name = product_item.find('h3').text.strip()# 提取商品价格(假设价格在span标签,class为'price')product_price = product_item.find('span', class_='price').text.strip()# 打印商品名称和价格print(f"商品名称:{product_name},价格:{product_price}")

2.2 利用Scrapy构建爬虫项目

2.2.1 Scrapy框架简介与项目创建

Scrapy,作为Python中强大的爬虫框架,如同一台全自动的挖掘机,能够高效有序地挖掘整个网站的深层信息。要启动一个Scrapy项目,首先确保已安装Scrapy,然后在命令行中创建一个新的爬虫项目:

# 创建名为my_shop_scraper的新Scrapy项目
scrapy startproject my_shop_scraper
cd my_shop_scraper
接下来,创建一个专门针对商品信息的Spider:# 在项目中创建名为ProductSpider的爬虫
scrapy genspider product example-shop.com products
2.2.2 Spider编写与Item定义
在项目的spiders目录下,编辑刚刚生成的ProductSpider.py文件,定义Spide如何解析网页内容和提取商品信息。同时,创建一个items.py文件,用来定义要抓取的数据结构:# items.py
import scrapyclass ProductItem(scrapy.Item):name = scrapy.Field()price = scrapy.Field()# 添加更多要抓取的商品属性字段...# ProductSpider.py
import scrapy
from my_shop_scraper.items import ProductItemclass ProductSpider(scrapy.Spider):name = 'product'allowed_domains = ['example-shop.com']start_urls = ['https://example-shop.com/products']def parse(self, response):for product in response.css('.product-list li'):item = ProductItem()item['name'] = product.css('h3::text').get().strip()item['price'] = product.css('.price::text').get().strip()yield item

2.2.3 Pipeline处理数据与中间件扩展功能

Scrapy的强大之处在于其Pipeline系统,它可以对抓取到的数据进行预处理、清洗、验证乃至持久化存储。此外,中间件可以定制和增强网络请求的过程,例如处理cookies、设置代理等。在实际项目中,根据需求编写Pipeline和中间件,将大大提升爬虫工作的效率和质量。

3、应对复杂场景的高级爬虫策略

3.1 动态网页抓取技术(Puppeteer与Selenium)

3.1.1 Puppeteer的异步渲染与交互式爬虫

Puppeteer是Google推出的一个Node.js库,它像一位操控Chrome浏览器的魔法师,能精确控制浏览器的行为,实现对现代Web应用的高效抓取。Puppeteer通过直接与Chromium浏览器通信,能够渲染JavaScript生成的内容,这对于处理异步加载和动态内容的网页来说至关重要。

例如,对于那些依赖AJAX或者使用React、Vue等前端框架构建的网页,常规的HTTP请求无法一次性获取全部数据。借助Puppeteer,你可以编写这样的爬虫逻辑:

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();// 访问电商网站首页await page.goto('https://example-dynamic-shop.com');// 等待动态内容加载完毕await page.waitForSelector('#dynamic-product-list');// 获取动态加载的商品列表DOM元素const productList = await page.$('#dynamic-product-list');// 解析DOM并提取商品信息const productsInfo = await page.evaluate((el) => {return Array.from(el.querySelectorAll('.product-item')).map(item => ({name: item.querySelector('.product-name').textContent.trim(),price: item.querySelector('.product-price').textContent.trim()}));}, productList);console.log(productsInfo);// 关闭浏览器await browser.close();
})();

3.1.2 Selenium模拟浏览器行为抓取动态数据

Selenium则是另一种跨平台的自动化测试工具,它同样能够操控真实浏览器(如Firefox、Chrome等),模拟用户行为进行网页交互,适用于抓取高度动态化的网页内容。不同于Puppeteer仅支持Chrome,Selenium可以搭配多种浏览器驱动进行操作。

下面是一个使用Python+Selenium抓取动态加载商品信息的例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 初始化WebDriver
driver = webdriver.Chrome()# 访问电商网站
driver.get("https://example-dynamic-shop.com")# 等待动态商品列表加载完毕
wait = WebDriverWait(driver, 10)
product_list = wait.until(EC.presence_of_element_located((By.ID, 'dynamic-product-list')))# 提取商品信息
products_info = []
for product in product_list.find_elements(By.CLASS_NAME, 'product-item'):name = product.find_element(By.CLASS_NAME, 'product-name').text.strip()price = product.find_element(By.CLASS_NAME, 'product-price').text.strip()products_info.append({"name": name, "price": price})print(products_info)# 关闭浏览器
driver.quit()

3.2 反爬机制识别与破解策略

3.2.1 常见反爬措施分析

许多网站为了避免被大量爬取导致服务器压力过大,或是出于版权、数据安全考虑,会采取各种反爬措施。常见的反爬手段包括但不限于检查User-Agent、限制IP访问频率、验证码校验、动态Token验证、JS混淆、滑动验证等。

3.2.2 代理IP轮换、User-Agent伪装等绕过反爬手段

面对反爬机制,爬虫开发者需要灵活运用各种策略来应对。比如通过代理IP池进行IP轮换来避免单一IP被封禁,使用随机或真实的User-Agent模仿不同用户访问,甚至在必要时结合OCR技术识别验证码,或者模拟登录、点击等行为来获取动态Token。

在使用代理IP时,可以这样更新requests库的请求头:

import random
import requestsproxy_list = [{'http': 'http://ip1:port'},{'http': 'http://ip2:port'},# 更多代理IP...
]def get_page_with_proxy(url):proxy = random.choice(proxy_list)proxies = {'http': proxy['http'], 'https': proxy['https']}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}response = requests.get(url, proxies=proxies, headers=headers)return response

4、电商网站商品信息抓取实战案例详解

4.1 设计爬虫目标与确定数据抽取规则

4.1.1 分析电商网站结构,明确抓取目标页面与元素

当我们计划从一个电商网站抓取商品信息时,首先要做的是对该网站的结构进行细致入微的分析。例如,假设我们要从一个虚拟的电商网站 www.example-shop.com 抓取商品列表页上的商品名、价格、评价数量以及商品详情链接。我们首先打开网站,查看商品列表是如何布局的,通常它们会被封装在特定的HTML标签中,比如

  • 内嵌套的
  • 元素代表单个商品。

4.1.2 制定数据提取策略与编写爬虫逻辑

根据网站的具体结构,我们制定数据抽取规则。例如,商品名称可能位于

标签中,价格可能在带有标签的元素里,而商品详情链接则可能是标签的href属性。明确了这些元素之后,我们可以开始编写爬虫逻辑。

4.2 代码实现与实战演示

4.2.1 利用Scrapy框架构建电商商品爬虫

假设我们使用Scrapy框架来创建一个爬虫,先初始化一个名为EcommerceCrawler的Spider,并定义初始URL以及解析函数:

import scrapyclass EcommerceCrawler(scrapy.Spider):name = 'ecommerce_crawler'start_urls = ['https://www.example-shop.com/products']def parse(self, response):# 解析商品列表项for product in response.css('.product-list li'):# 提取商品信息item = {'name': product.css('.product-title::text').get().strip(),'price': product.css('.price::text').get().strip(),'reviews_count': product.css('.review-count::text').get().strip(),'detail_url': response.urljoin(product.css('.product-link::attr(href)').get()),}# 请求详情页并进一步抓取数据(这里仅演示请求部分,详情页解析需另写函数)yield scrapy.Request(item['detail_url'], callback=self.parse_product_detail, meta={'item': item})def parse_product_detail(self, response):# 在这里解析商品详情页,完善item数据,并最终yield item...

4.2.2 遇到动态加载及反爬时采用Puppeteer或Selenium进行数据抓取

若商品列表采用AJAX动态加载,或存在反爬机制,我们可以采用Puppeteer或Selenium来模拟浏览器行为。例如,使用Puppeteer配合Node.js进行动态加载商品信息的抓取:

const puppeteer = require('puppeteer');async function scrapeProductList() {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://www.example-shop.com/products');await page.waitForSelector('.product-list .product-loaded'); // 等待动态加载完成const products = await page.$$eval('.product-list li', productsElements => {return productsElements.map(productEl => {return {name: productEl.querySelector('.product-title').textContent.trim(),price: productEl.querySelector('.price').textContent.trim(),reviewsCount: productEl.querySelector('.review-count').textContent.trim(),detailUrl: productEl.querySelector('.product-link').href,};});});await browser.close();return products;
}scrapeProductList().then(products => console.log(products));

请注意,实际编写爬虫时需要替换.product-list、.product-title、.price、.review-count、.product-link等CSS选择器以匹配实际网站的HTML结构。在遵守网站使用政策和相关法律法规的前提下,这种实战案例展示了如何有效地设计和实施网络爬虫策略,以便从电商网站上高效、合法地抓取商品信息。在后续的数据处理环节,抓取到的数据将进一步清洗、整理和存储。

5、数据存储与后期处理

5.1 数据持久化存储方案

5.1.1 将抓取结果保存为CSV、JSON或数据库

在抓取到电商网站的商品信息后,我们需要将其妥善存储以便后续分析和使用。最常见的做法是将数据导出为便于查阅和交换的文件格式,例如CSV(逗号分隔值)和JSON(JavaScript Object Notation)。以Python为例,我们可以利用内置的csv模块或json模块轻松实现数据的持久化存储:

import csv
import json# 假设data是一个包含商品信息的列表
data = [... 商品信息列表...]# 将数据保存为CSV文件
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:writer = csv.DictWriter(csvfile, fieldnames=['product_name', 'price', 'category', ...])writer.writeheader()for item in data:writer.writerow(item)# 将数据保存为JSON文件
with open('products.json', 'w', encoding='utf-8') as jsonfile:json.dump([d for d in data], jsonfile, ensure_ascii=False, indent=4)# 或者,直接将数据存入关系型数据库如SQLite或MySQL
# (这里以SQLite为例,使用sqlite3模块)
import sqlite3conn = sqlite3.connect('products.db')
c = conn.cursor()# 创建表结构
c.execute('''CREATE TABLE products(id INTEGER PRIMARY KEY AUTOINCREMENT,product_name TEXT NOT NULL,price REAL,category TEXT,... 其他字段 ...)''')# 插入数据
for item in data:c.execute("INSERT INTO products VALUES (?, ?, ?, ?)", (None, item['product_name'], item['price'], item['category'], ...))# 提交事务并关闭连接
conn.commit()
conn.close()

5.1.2 使用MongoDB等NoSQL数据库存储非结构化数据

对于更复杂、非固定模式的数据,诸如电商网站中包含评论、用户行为等多样化信息的情况,可以选用MongoDB这类NoSQL数据库进行存储。MongoDB以其灵活性和对JSON文档的良好支持,使得存储和查询非结构化数据变得更为便捷。借助Python的pymongo库,我们能够轻松地将抓取到的数据存入MongoDB:

from pymongo import MongoClient# 连接MongoDB数据库
client = MongoClient('mongodb://localhost:27017/')
db = client['ecommerce_db']
collection = db['products']# 将数据插入MongoDB集合
for item in data:collection.insert_one(item)# 关闭连接
client.close()

5.2 数据清洗与初步分析

5.2.1 数据预处理技巧与正则表达式应用

抓取到的数据往往需要经过清洗和预处理才能用于进一步分析。例如,去除空格、转换数据格式、标准化字符串等。正则表达式在此过程中扮演了关键角色,它可以用于查找和替换特定的文本模式。例如,清除商品名称中的特殊字符和多余空格:

import redef clean_product_name(name):cleaned_name = re.sub(r'[^\w\s]', '', name)  # 删除特殊字符cleaned_name = re.sub(r'\s+', ' ', cleaned_name).strip()  # 替换连续空格为单个空格并去除首尾空格return cleaned_name# 应用到数据清洗
for item in data:item['cleaned_product_name'] = clean_product_name(item['product_name'])

5.2.2 使用Pandas进行数据清洗与简单统计分析

Pandas库是Python中广泛使用的数据处理工具,它提供了方便的数据结构DataFrame,使数据清洗、过滤、排序、合并、统计等工作变得更加容易。以下是一个简单的示例,展示如何使用Pandas进行数据清洗和统计:

import pandas as pd# 将数据转换为Pandas DataFrame
df = pd.DataFrame(data)# 数据清洗示例:填充缺失值、删除重复项
df = df.fillna('N/A')  # 用'N/A'填充缺失值
df = df.drop_duplicates()  # 删除重复行# 统计分析示例:计算各价格区间内的商品数量
price_bins = [0, 10, 50, 100, 200, float('inf')]  # 设置价格区间
df['price_category'] = pd.cut(df['price'], bins=price_bins, labels=['低价', '中低价', '中高价', '高价'])
price_counts = df['price_category'].value_counts(normalize=True) * 100  # 百分比形式
print(price_counts)

6、网络爬虫的伦理道德与法律法规约束

6.1 网络爬虫的法律边界与合理使用原则

6.1.1 遵守robots.txt协议与尊重网站版权

网络爬虫在活动之初,应当养成良好习惯,即检查目标网站的robots.txt文件。此文件就如同网站主人挂在门口的公告牌,明确规定哪些区域允许访问,哪些区域禁止进入。例如,如果robots.txt文件指定了某些路径不应被爬取,爬虫开发者应当遵守这一约定,以免触及法律和道德底线。

举个例子,如果我们想爬取某个电商网站的数据,首先访问其https://www.example-shop.com/robots.txt来查看相关规定。如果发现某个目录或网页不允许爬虫访问,则应当尊重这一指示,避免对其进行抓取。

6.1.2 数据隐私保护与GDPR等相关法规解读

随着数据隐私保护意识的提升,各国和地区纷纷出台相关法律法规,如欧盟的《通用数据保护条例》(GDPR)。网络爬虫在抓取数据时,务必注意不得侵犯个人隐私,尤其涉及用户身份、联系方式等敏感信息时,应确保符合相关法律法规的要求。

例如,在抓取电商网站的商品评论时,如果评论包含用户名或邮箱等个人信息,爬虫应当对此类数据进行匿名化处理,或者在未经用户同意的情况下,只抓取不包含个人信息的部分内容。另外,在存储和使用抓取的数据时,也应遵循数据最小化原则,仅保留业务所需信息,并确保数据的安全存储与传输。

实践指导

在实际操作中,可以采取以下措施确保网络爬虫的合规运行:

审查robots.txt:每次开始新项目时,都应首先查看目标网站的robots.txt文件,确认抓取范围。
数据脱敏:对可能涉及个人隐私的信息进行脱敏处理,如使用哈希或加密方式代替原始数据。
用户通知与同意:若有必要收集用户个人信息,应在法律允许的范围内取得用户的知情同意。
法律咨询:对于大规模的数据抓取项目,建议咨询法律顾问,确保整个爬虫流程符合当地法律法规要求。
总之,在享受网络爬虫带来的便利和价值的同时,我们必须意识到维护网络安全、尊重他人知识产权和保障个人隐私的重要性。只有遵循伦理规范、严格遵守法律法规,才能让网络爬虫技术在社会发展中发挥积极作用,而不至于成为侵害他人权益的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌推出全新AI生成游戏玩法 —— 无限生成角色生活模拟游戏“Unbounded”

随着人工智能技术的飞速发展,游戏行业正迎来前所未有的创新。近日,谷歌宣布了一款名为“Unbounded”的新型游戏,这是一款基于生成式AI技术的角色生命模拟游戏,它将为玩家带来前所未有的开放性和互动性体验。 项目概览 项目名称:Unbounded类型:生成式无限游戏(Generati…

论文阅读:DynamicDet: A Unified Dynamic Architecture for Object Detection

论文地址:[2304.05552] DynamicDet: A Unified Dynamic Architecture for Object Detection 代码地址:GitHub - VDIGPKU/DynamicDet: [CVPR 2023] DynamicDet: A Unified Dynamic Architecture for Object Detection 概要 本文提出了一种名为 DynamicD…

关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题

关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题 这是一个DevOps综合性问题docker buildx多架构打包.NET应用的问题用QEMU模拟多架构环境打包 这是一个DevOps综合性问题 网络上的方案都是细分的领域,未见一个集成了GitLabdockerdotnet的多架…

翻译工具开发技术笔记:《老挝语翻译通》app支持语音识别翻译功能,怎么提高语音识别的准确度呢?

《老挝语翻译通》app是一款专为老挝语翻译设计的免费工具,支持文本翻译、老挝文OCR文字识别提取、文字转语音。这款工具以其技术优势和用户友好的界面,为用户提供了便捷的老挝语翻译体验。 技术特点 文本翻译:支持双语输入,提供精…

qt QListView详解

1、概述 QListView 是 Qt 框架中的一个视图类,用于展示模型中的数据。它基于 QAbstractItemView,支持多种视图模式,如列表视图(List View)、图标视图(Icon View)等。QListView 是模型/视图框架…

初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

目录 一、C的关键字(C98) 二、命名空间 1、命名冲突 2、命名空间 2.1 命名空间的定义 (1). 命名空间定义的例子以及命名空间的嵌套: (2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中: 2…

MySQL_客户端工具建库.

前言: 通过前面的学习我们已经了解到什么是数据库,以及数据库是如何安装的,相信大家都已将数据库安装好了,让我们接下来开始新的学习吧!!! 1.MySQL客户端工具 1. MySQL Workbench MySQL :: D…

突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳

在工程应用中,如燃气轮机、核反应堆和航空推进系统,对具备优异高温机械性能的金属合金需求十分旺盛。由于材料熔点的固有限制,传统镍基 (Ni) 高温合金的耐温能力已接近极限。为满足开发高温结构材料的需求,耐火高熵合金 (RHEAs) 于…

leetcode21:合并两个有序列表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出:[]示…

开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…

K8S篇(基本介绍)

目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

关于路由笔记

路由 定义: 在计算机网络中,路由是将数据包从源节点传输到目标节点的过程。这个过程涉及到网络中的多个设备,如路由器、交换机等,其中路由器起着关键的决策作用。 工作原理示例: 假设你在一个公司的局域网内&#…

人工智能之人脸识别(人脸采集人脸识别)

文章目录 前言PySimpleGUI 库1-布局和窗口 前言 例如:随着人工智能的不断发展,本文主要介绍关于人工智能中GUI和PyMysql相应用。 本文采用代码+逻辑思路分析的方式有助于理解代码。 PySimpleGUI 库 PySimpleGUI 是一个用于简化 GUI 编程的…

如何找到养生生活视频素材?推荐几个优秀网站

今天,我们来聊一个实用的话题,那就是如何找到优质的养生视频素材。作为自媒体创作者,高质量的视频素材对内容制作至关重要。不论你是刚入行的新手,还是已经积累了一定粉丝的大V,找到合适的养生视频素材都能帮助你更好地…

旋转对称性,旋转矩阵的特征矢量也是T3矩阵的特征矢量

旋转对称性要求T3矩阵,在旋转后,特征矢量没发生改变,特征值大小也没变,即T3矩阵没有改变

美畅物联丨物联网通信新纪元:Cat.1与5G RedCap的差异化应用

​ 在物联网(IoT)迅猛发展的时代,通信标准对物联网设备的连接性、性能和适用性有着极为关键的作用。小编在《美畅物联丨Cat.1与NB-IoT:物联网设备的通信标准对比》中提到Cat.1与NB-IoT的对比区别,后来就有小伙伴问&…

OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法,特别适用于目标跟踪、图像分割等任务。该算…

应急救援无人车:用科技守护安全!

一、核心功能 快速进入危险区域: 救援无人车能够迅速进入地震、火灾、洪水等自然灾害或重大事故的现场,这些区域往往对人类救援人员构成极大威胁。 通过自主导航和环境感知技术,无人车能够避开危险区域,确保自身安全的同时&…

安装acondana3, Conda command not found

Linux 服务器安装acondana3后 输入conda找不到 写入路径也没找到 vim ~/.bashrc 加入 PATH"root/anaconda3/bin:$PATH" 更新文件: source ~/.bashrc 还是找不到conda 命令 解决办法 source ~/anaconda3/etc/profile.d/conda.sh conda activate Your_e…

第07章 运算符的使用

一、算数运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 ()、减(-)、乘(*)、除(/)和取模(%&a…