数据新探:用Python挖掘互联网的隐藏宝藏

Hello,我是你们的阿佑,今天给大家上的菜是——数据存储!听起来枯燥无味?错了!阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆,为你的数据选择合适的存储方式同样重要!

文章目录

    • 1. 引言
      • 1.1 数据抓取在信息时代的意义
      • 1.2 有效存储抓取数据的重要性
    • 2. 数据抓取
      • 2.1 发送请求获取网页内容
        • 2.1.1 利用`requests`定制请求 headers
        • 2.1.2 处理请求异常与重试机制
      • 2.2 解析网页提取信息
        • 2.2.1 `BeautifulSoup`高级用法:复杂选择器与数据提取技巧
        • 2.2.2 动态页面数据抓取:Selenium初步介绍
    • 2. 数据抓取
      • 2.3 实战案例:简单网页内容抓取
        • 2.3.1 目标选取与策略规划
        • 2.3.2 编写代码实现数据提取
  • 数据抓取与存储
    • 3. 数据存储
      • 3.1 数据清洗
        • 3.1.1 去除无效标签与空白字符
        • 3.1.2 数据标准化处理
      • 3.2 存储方式概览
        • 3.2.1 文本文件存储(CSV, JSON)
        • 3.2.2 关系型数据库(SQLite, MySQL)基础
        • 3.2.3 非关系型数据库(MongoDB)简介
      • 3.3 实现数据存储示例
        • 3.3.1 CSV存储:使用pandas库导出数据
        • 3.3.2 数据库操作入门:连接、插入数据至SQLite
  • 数据抓取与存储
    • 4. 结论
      • 4.1 本章核心知识回顾
      • 4.2 数据抓取与存储在项目中的综合运用思考

在这里插入图片描述

1. 引言

在这个信息爆炸的时代,我们每天都在产生海量的数据。从社交媒体的动态,到新闻网站的头条,再到电商网站上的商品信息,数据无处不在。想象一下,如果你是一名侦探,那么数据就是你的线索,而数据抓取就是你的放大镜和显微镜,帮助你从海量的线索中找到真相。

1.1 数据抓取在信息时代的意义

数据抓取,就像是在互联网的海洋中捕鱼,你需要一张网,这张网就是你的抓取工具。无论是用Python的requests库,还是用爬虫框架Scrapy,你都能从网页上抓取到你想要的信息。这不仅仅是为了获取数据,更是为了获取那些能够为你所用,能够转化为价值的信息。

想象一下,你是一名市场分析师,你需要了解竞争对手的动态,那么通过数据抓取,你可以实时监控对手的网站,获取他们的产品信息、价格变动、促销活动等,这些信息对于制定市场策略至关重要。

1.2 有效存储抓取数据的重要性

抓取到的数据就像是刚捕捞上来的鱼,如果不好好处理,很快就会变质。因此,数据的存储和清洗就显得尤为重要。你需要将数据进行清洗,去除无效的标签和空白字符,进行数据标准化处理,这样数据才能被有效地利用。

再以侦探为例,你抓取到的线索需要被整理和归档,这样在需要的时候才能迅速找到。同样,数据也需要被有效地存储,无论是用文本文件(如CSV、JSON),还是用数据库(如SQLite、MySQL),都是为了能够方便地检索和分析。

接下来阿佑将带着大家们继续深入探索数据抓取的具体技术细节,以及如何有效地存储和管理这些数据。

请记住,数据是新时代的石油,而掌握数据抓取与存储的技能,就是掌握了挖掘和提炼这种宝贵资源的能力!


2. 数据抓取

何为数据抓取?简而言之数据抓取就像是咱们在参与一场精心策划的荒野求生(没错,就是那个生吃xx的贝爷),在这之前咱们需要准备合适的工具、规划清晰的路线,还要学会应对各种未知的挑战~

2.1 发送请求获取网页内容

在互联网这个大舞台上,每个网站都是一个独立的表演者,而我们要做的,就是成为那个能够欣赏到精彩表演的观众。但是,如果我们直接闯进去,可能会被“保安”(网站的反爬虫机制)给拦下来。所以,我们需要乔装打扮,低调入场。

2.1.1 利用requests定制请求 headers

首先,我们需要一件“外套”——也就是我们的请求头(headers)。请求头里包含了很多信息,比如我们是谁(User-Agent),我们从哪里来(Referer),我们想要什么(Accept)等等。

想象一下,你是一位侦探,需要潜入一个高端的社交场合。你不能穿着牛仔裤和T恤就去了,你需要西装革履,带上礼帽,这样才不会引起怀疑。同样,在发送HTTP请求时,我们也需要伪装成浏览器,而不是赤裸裸的爬虫。

下面是一个使用requests库发送HTTP请求,并设置自定义headers的示例:

import requests# 目标网页
url = 'http://example.com'# 定制的请求头
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','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'en-US,en;q=0.5','Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive','DNT': '1'
}# 发送请求
response = requests.get(url, headers=headers)# 检查请求是否成功
if response.status_code == 200:print('请求成功!')
else:print('请求失败,错误代码:', response.status_code)

上面的代码模拟了一个浏览器的请求,使用了常见的User-Agent字符串,以及其他一些headers,来提高请求的成功率。

2.1.2 处理请求异常与重试机制

但是,即使我们伪装得再好,也有可能遇到意外情况,比如网络断了,或者网站暂时不可用。这时候,我们就需要有一个“备用计划”。

在编程中,这个备用计划就是异常处理和重试机制。我们可以使用Python的try...except语句来捕获异常,并使用循环来实现重试。

下面是一个带有异常处理和重试机制的请求示例:

import time# 尝试次数
max_attempts = 5for attempt in range(max_attempts):try:response = requests.get(url, headers=headers)if response.status_code == 200:print('请求成功!')breakelse:print('请求失败,错误代码:', response.status_code)except requests.exceptions.RequestException as e:print('请求异常:', e)# 等待一段时间后重试time.sleep(2 ** attempt)if attempt == max_attempts - 1:print('尝试了', max_attempts, '次,仍然无法成功请求。')

上面的代码尝试了5次,如果每次都失败了,就会打印出错误信息。每次重试之间,代码会等待的时间是指数增长的(2的幂),这样可以避免在网站暂时不可用时,过于频繁地发送请求。


通过上述的实战小项目,咱们一块学会了如何用requests库发送HTTP请求,并如何设置了自定义的headers来伪装成浏览器。咱们还学会了如何处理请求过程中可能出现的异常,并实现了一个简单的重试机制。这些技能将为我们的数据抓取之旅打下坚实的基础。接下来,我们将探索如何解析网页并提取出我们需要的信息,加油 (ง •_•)ง !

在这里插入图片描述

2.2 解析网页提取信息

在数据抓取的世界里,一旦我们成功地用requests库获取了网页内容,接下来就是展现真正技术的时刻了——解析这些内容,提取出我们感兴趣的数据。

2.2.1 BeautifulSoup高级用法:复杂选择器与数据提取技巧

BeautifulSoup是我们的“瑞士军刀”,它可以帮助我们从HTML的丛林中找到那些隐藏的宝石。但是,如果你面对的是一个结构复杂的网页,你可能需要一些更高级的技巧。

想象一下,你是一位寻宝者,而网页就像是一张错综复杂的藏宝图。你需要学会阅读这张地图上的每一个标记和符号,才能找到宝藏。在BeautifulSoup中,这些“标记和符号”就是选择器。

下面是一个使用BeautifulSoup提取网页中所有链接的示例:

from bs4 import BeautifulSoup
import requests# 发送HTTP请求获取网页内容
response = requests.get('http://example.com')
response.raise_for_status()  # 如果请求失败,将抛出异常# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')# 提取所有的链接
links = soup.find_all('a')# 打印每个链接的href属性(即URL)
for link in links:print(link.get('href'))

上面的代码首先发送一个GET请求到指定的URL,并使用BeautifulSoup解析返回的HTML内容。然后,它使用find_all方法找到所有的<a>标签(即链接),并打印出每个链接的href属性。

但是,如果你想要提取的数据不是那么简单,比如某个特定的类别的商品信息,你可能需要使用更复杂的选择器。这时,你可以利用CSS选择器的强大功能:

# 假设我们想要提取特定类别的商品信息
products = soup.select('.product-category .product-name')for product in products:print(product.text)

上面的代码使用了select方法和CSS选择器来找到所有属于某个类别的商品名称。

2.2.2 动态页面数据抓取:Selenium初步介绍

有时候,宝藏并不是那么容易找到的。有些网站的数据是通过JavaScript动态加载的,这意味着使用requestsBeautifulSoup可能无法获取到这些数据。这时,我们需要一个更强大的工具——Selenium。

Selenium是一个用于模拟浏览器操作的工具,它可以让我们控制一个真实的浏览器,就像真人使用浏览器一样。

想象一下,你是一位特工,需要潜入一个高度安全的网站。你不能简单地走进去,你需要伪装、策略,甚至可能需要一些小道具。Selenium就是我们的伪装和小道具。

下面是一个使用Selenium获取动态加载数据的示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys# 设置Selenium WebDriver
driver = webdriver.Chrome()# 打开网页
driver.get('http://example.com')# 等待页面加载完成
driver.implicitly_wait(10)  # 等待最多10秒# 定位元素并进行操作,例如填写搜索框并提交
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('数据抓取')
search_box.send_keys(Keys.RETURN)# 等待搜索结果加载
driver.implicitly_wait(10)# 使用BeautifulSoup解析当前页面的HTML内容
from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser')# 提取搜索结果中的数据
# 假设搜索结果的标题都包含在<h2>标签中
titles = soup.find_all('h2')for title in titles:print(title.text)# 关闭浏览器
driver.quit()

上面的代码首先启动了一个Chrome浏览器实例,然后访问了一个网页,进行了搜索操作,等待搜索结果加载完成后,使用BeautifulSoup解析当前页面的HTML内容,并提取了搜索结果的标题。


通过上述内容,我们学会了如何使用BeautifulSoup来解析HTML内容,并使用CSS选择器来提取复杂的数据。我们还了解了如何使用Selenium来处理那些通过JavaScript动态生成的内容。掌握了这些技能,你将能够在数据抓取的海洋中乘风破浪,找到那些隐藏的宝藏!

好的,让我们以一种接地气且有趣的方式深入探讨第2.3点——实战案例:简单网页内容抓取。


2. 数据抓取

2.3 实战案例:简单网页内容抓取

在数据抓取的世界里,理论是灰色的,而生命之树常青。掌握了requestsBeautifulSoup的使用,了解了Selenium的魔力,现在是时候将这些工具应用到实战中,抓取我们想要的数据了。

2.3.1 目标选取与策略规划

首先,我们需要确定目标。想象一下,你是一位猎人,你需要知道你要打的是什么猎物。在数据抓取中,这就意味着你需要知道你想从哪个网站抓取什么数据。

举个例子,假设我们想从一个新闻网站抓取最新的新闻标题和链接。在开始之前,我们需要规划一下策略:

  1. 分析网站的结构,找到新闻标题和链接所在的HTML标签和属性。
  2. 设定请求头,模拟浏览器访问。
  3. 发送请求,获取网页内容。
  4. 使用BeautifulSoup解析内容,提取新闻标题和链接。
  5. 存储提取的数据。
2.3.2 编写代码实现数据提取

接下来,让我们编写一个完整的代码示例,来实现上述策略:

import requests
from bs4 import BeautifulSoup# 目标新闻网站
url = 'http://news.example.com'# 模拟浏览器的请求头
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'
}# 发送HTTP请求
response = requests.get(url, headers=headers)# 确保请求成功
if response.status_code == 200:# 使用BeautifulSoup解析网页内容soup = BeautifulSoup(response.text, 'html.parser')# 假设新闻标题和链接都在<div class="news-item">中news_items = soup.find_all('div', class_='news-item')for item in news_items:# 提取新闻标题,假设标题在<h2>标签中title = item.find('h2').text.strip()# 提取新闻链接,假设链接在<a>标签的href属性中link = item.find('a')['href'].strip()# 打印新闻标题和链接print(f'标题: {title}')print(f'链接: {link}')print('---')
else:print('请求网页失败,错误代码:', response.status_code)

在这个例子中,我们首先定义了目标URL和自定义的请求头。然后,我们发送了一个GET请求到新闻网站,并检查了响应状态码以确保请求成功。接下来,我们使用BeautifulSoup解析HTML内容,并查找所有包含新闻的<div>元素。对于每个新闻项,我们提取了标题和链接,并打印出来。

请注意,这个代码示例是一个简化的版本,实际的网页结构可能会更复杂,需要根据实际情况调整选择器。


通过上述的代码,阿佑带着完成了一个简单的数据抓取实战案例。我们从确定目标开始,规划了抓取策略,然后编写并运行了代码来提取新闻标题和链接。这个过程中,我们不仅实践了之前学到的理论知识,还获得了宝贵的实战经验。掌握了这些技能,你将能够在数据的海洋中航行得更远,探索得更深。

接下来,我们将学习如何将这些抓取到的数据进行清洗和存储,以便更好地利用它们。

在这里插入图片描述
好的,让我们以一种接地气且有趣的方式继续探讨第3点——数据存储。


数据抓取与存储

3. 数据存储

数据存储,就像是给你辛苦抓取的数据找个家。不过,不是随便找个地方就行,你需要一个既安全又方便的地方,这样你的数据才能住得舒服,你也才能随时找到它们。

3.1 数据清洗

3.1.1 去除无效标签与空白字符

在数据抓取回来之后,你会发现数据里有很多“垃圾”,比如无关的HTML标签、多余的空格、换行符等。这就像是你刚搬进新家,却发现房间里满是前任房客留下的杂物一样。

这时候,你需要进行数据清洗。Python中的re库和字符串方法可以帮你大忙,帮你去除这些无效的标签和空白字符。比如,你可以用re.sub(r'\s+', ' ', data)来移除多余的空格,让数据更加整洁。

3.1.2 数据标准化处理

数据清洗之后,还需要进行数据标准化处理。这就像是给你的家具统一风格,让它们看起来更加和谐。在数据中,这通常意味着将不同的数据格式统一,比如将日期格式统一为YYYY-MM-DD,将数字格式统一为没有千位分隔符的格式等。

3.2 存储方式概览

3.2.1 文本文件存储(CSV, JSON)

文本文件是存储数据的一种简单方式,尤其是对于小型项目或者一次性的数据存储需求。CSV和JSON格式都是不错的选择。

CSV(逗号分隔值)文件看起来就像是一张表格,非常适合存储结构化数据。而JSON(JavaScript对象表示法)文件则更加灵活,可以存储更复杂的数据结构。

想象一下,CSV文件就像是你的书架,每一本书都有自己的位置;而JSON文件就像是你的储物箱,里面可以放各种形状的物品。

3.2.2 关系型数据库(SQLite, MySQL)基础

对于更复杂的数据存储需求,你可能需要用到关系型数据库。关系型数据库就像是一个大的图书馆,每本书都有自己的编号,你可以快速地找到任何一本书。

SQLite是一个轻量级的数据库,非常适合小型项目。而MySQL则更加强大,适合大型项目。它们都使用SQL语言来操作数据,包括创建表、插入数据、查询数据等。

3.2.3 非关系型数据库(MongoDB)简介

非关系型数据库,又称为NoSQL数据库,是另一种存储数据的方式。它们适合存储非结构化或者半结构化的数据。

MongoDB是一个非常流行的NoSQL数据库,它使用文档来存储数据,这些文档可以有非常灵活的结构。MongoDB就像是你的衣柜,你可以随意地放置各种衣物,而不需要担心它们的形状和大小。

3.3 实现数据存储示例

3.3.1 CSV存储:使用pandas库导出数据

Python中的pandas库是一个非常强大的数据处理工具,它不仅可以帮你清洗和处理数据,还可以帮你将数据导出为CSV文件。

import pandas as pd# 假设df是你的DataFrame
df.to_csv('data.csv', index=False)

上面的代码会将DataFrame df 导出为一个名为data.csv的CSV文件。

3.3.2 数据库操作入门:连接、插入数据至SQLite

如果你选择使用SQLite数据库,你可以通过Python的sqlite3库来操作数据库。

import sqlite3# 连接到SQLite数据库
# 如果文件不存在,会自动在当前目录创建一个
conn = sqlite3.connect('data.db')# 创建一个表
conn.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')# 插入一条数据
conn.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))# 提交事务
conn.commit()# 关闭连接
conn.close()

上面的代码展示了如何使用sqlite3库来连接到一个SQLite数据库,创建一个表,并插入一条数据。


数据存储部分的内容到此为止。记得,数据存储不仅仅是为了保存数据,更是为了让你能够方便地管理和使用数据。选择合适的存储方式,就像是给你的数据找一个合适的家,这样它们才能更好地为你服务。

在这里插入图片描述

好的,让我们以一种轻松有趣的方式来书写第4点——结论。


数据抓取与存储

4. 结论

到了这里,我们的数据抓取与存储之旅就快要画上句号了。不过,别急着走,咱们来聊聊这次探险的收获,以及如何将这些宝贵的经验应用到实际的战斗中去。

4.1 本章核心知识回顾

首先,让我们来回顾一下这次探险的要点:

  • 数据抓取:我们学会了如何使用requests库和BeautifulSoup来获取和解析网页数据,还了解了如何用Selenium来处理那些棘手的动态网页。
  • 数据清洗:我们掌握了去除无效标签和空白字符的技巧,以及如何进行数据标准化处理。
  • 数据存储:我们探索了多种存储方式,包括文本文件(CSV, JSON)、关系型数据库(SQLite, MySQL)和非关系型数据库(MongoDB),并学习了如何使用pandas库将数据导出为CSV文件,以及如何使用sqlite3库进行数据库的基本操作。

4.2 数据抓取与存储在项目中的综合运用思考

现在,你已经拥有了在互联网上抓取和存储数据的武器。但是,如何将这些技能应用到实际的项目中呢?让我们来举几个例子:

例子1:市场分析

假设你是一名市场分析师,需要监控竞争对手的价格变动。你可以编写一个爬虫,定期抓取对手网站上的商品价格,然后将这些数据存储到数据库中。之后,你可以编写一个简单的数据分析脚本,来找出价格变动的趋势和模式。

例子2:社交媒体监控

如果你是一名社交媒体经理,需要监控品牌在社交媒体上的提及情况。你可以使用Selenium来抓取社交媒体网站上的帖子,然后将这些数据存储到MongoDB中。MongoDB的灵活性可以让你轻松地存储帖子的各种信息,如文本、图片、标签等。

例子3:个人数据管理

对于个人用户,你可以使用数据抓取和存储技术来管理你的个人数据。比如,你可以抓取你的电子邮件,然后将邮件内容存储到SQLite数据库中。这样,你就可以使用SQL查询来快速找到你需要的邮件。

import sqlite3# 连接到SQLite数据库
conn = sqlite3.connect('emails.db')# 创建一个表
conn.execute('CREATE TABLE IF NOT EXISTS emails (id INTEGER PRIMARY KEY, subject TEXT, body TEXT, sender TEXT, receiver TEXT)')# 插入一条数据
conn.execute('INSERT INTO emails (subject, body, sender, receiver) VALUES (?, ?, ?, ?)', ('Meeting', 'Let\'s meet at 10am tomorrow.', 'alice@example.com', 'bob@example.com'))# 提交事务
conn.commit()# 关闭连接
conn.close()

上面的代码展示了如何将一条电子邮件数据存储到SQLite数据库中。


通过这些例子,我们可以看到,数据抓取与存储在各种项目中都有广泛的应用。掌握了这些技能,就像是拥有了一张通往宝藏的地图,剩下的,就是如何去发现和挖掘这些宝藏了。

请记住,数据是新时代的石油,而你,已经拥有了开采和提炼它的工具。现在,是时候和阿佑一块开启专属我们自己的探险之旅了!

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

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

相关文章

版本控制:软件开发的基石(一文读懂版本控制)

未经允许&#xff0c;禁止转载&#xff01; 在现代软件开发中&#xff0c;版本控制是不可或缺的工具。它帮助开发者跟踪和管理代码的变化&#xff0c;协作完成项目&#xff0c;并确保代码的完整性和安全性。本文将基于Git官网的视频“什么是版本控制”来深入探讨版本控制的基本…

Linux实验 vi编辑器的使用与磁盘管理

实验目的&#xff1a; 掌握vi编辑器的启动、保存和退出&#xff1b;掌握vi编辑器的三种工作模式的转换及输入模式下的操作&#xff1b;了解Linux文件系统类型、虚拟文件系统和存储设备的名称&#xff1b;掌握磁盘文件系统的挂载和卸载&#xff1b;掌握常用磁盘操作命令&#x…

C. Sort Zero

题目描述 思路分析: 记住他是要保证这个数列是不降的,也就是说如果某一个位置上的数变成了0,那么这个数前面的部分一定全都是0了,我们用map数组得到每一个数出现的最晚的位置,先从后向前遍历一遍,找出从哪开始出现了递减,然后标记下来结束即可,看看前面的每一个数都要用st标记是…

关于nvm管理node版本的一些问题

背景&#xff1a; 基于开发项目的迭代不能做到全部更新&#xff0c;有的项目是vue2.0 有的项目是vue3.0&#xff0c; 那么我们开发的时候就需要对node 进行更新&#xff0c;进而产生因为版本不同导致的错误&#xff1a;由此我们需要一款管理 切换node版本的东西&#xff0c;那就…

C语言 8 函数递归

目录 1. 递归是什么&#xff1f; 2.递归的限制条件 3. 递归举例1 4. 递归举例2 5.迭代 6. 递归举例3 拓展学习&#xff1a; 1. 递归是什么&#xff1f; 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c…

0508GoodsContent的Maven项目

0508GoodsContent的Maven项目包-CSDN博客 数据库字段 页面需求

ssl证书申请配置要怎么弄?

SSL证书是一种公钥证书&#xff0c;用于保护网站的数据传输过程&#xff0c;确保网站数据的安全性。在网站上使用SSL证书可以有效地防止黑客攻击、窃取用户信息等安全问题。下面将详细介绍SSL证书的申请和配置。 一、SSL证书的申请 1. 选择证书品牌和类型 目前市场上有很多S…

手撸XXL-JOB(四)——远程调用定时任务

Java Socket网络编程 网络编程是Java编程中的重要组成部分&#xff0c;包括服务端和客户端两部分内容。Socket是Java网络编程的基本组件之一&#xff0c;用于在应用程序之间提供双向通信&#xff0c;Socket提供了一种标准的接口&#xff0c;允许应用程序通过网络发送和接收数据…

【递归、回溯和剪枝】综合训练<二>

1.组合总和 组合总和 解法一&#xff1a; class Solution { public:vector<vector<int>> ret;vector<int> path;int aim;vector<vector<int>> combinationSum(vector<int>& nums, int target) {aim target;dfs(nums, 0, 0);return …

BOM部分

一&#xff0c;概述 二&#xff0c;Windows对象常见的事件 1.窗口加载事件 上面那个是会等页面都加载完了&#xff0c;在进行函数的调用或者触发事件&#xff0c;如&#xff08;图像&#xff0c;文本&#xff0c;css&#xff0c;js等&#xff09;&#xff0c;所以那个声明可以…

景源畅信数字:抖音热门赛道有哪些?

抖音&#xff0c;作为当下流行的短视频平台&#xff0c;吸引了无数用户和创作者。热门赛道&#xff0c;即平台上受关注度高、活跃用户多的内容领域&#xff0c;是许多内容创作者关注的焦点。这些赛道不仅反映了用户的兴趣偏好&#xff0c;也指引着创作的方向。 一、美食制作与分…

docker 部署 prometheus + Grafana +

# prometheus安装 # 1.拉镜像 docker pull prom/prometheus:v2.43.0 # 2.创建配置文件 mkdir /opt/prometheus/data cd /opt/prometheus/ vi prometheus.yml # 3.使用root用户启动 docker run --name prometheus -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/pro…

企业必看:镭速教你如何测试内网文件传输效率和稳定问题

在现代商业运作中&#xff0c;企业内部文件传输的效率和稳定性对于数据管理和业务流程极为重要。无论是远程工作还是团队协作&#xff0c;高效的文件传输都能显著提升工作效率。今天镭速小编就教你如何测试内网文件传输效率和稳定问题。 1、磁盘性能&#xff0c;即硬盘的读取和…

基于Spring Cloud的房产销售平台设计与实现

基于Spring Cloud的房产销售平台设计与实现 开发语言&#xff1a;Java 框架&#xff1a;SpringCloud JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页界面&#xff0c;前台首页包括房源信息、…

Airtest核心API汇总

2024.2.25更新&#xff1a;新增剪切板、Airtest1.3.3touch/swipe支持绝对坐标和相对坐标 2023.9.3更新&#xff1a;Airtest1.2.7新增14个断言、断开连接API&#xff1b;Airtest1.2.10.2新增录屏API&#xff1b; 以下基于airtest1.2.0(截止2021.7.12&#xff0c;最新版本) https…

揭秘奇葩环境问题:IDEA与Maven版本兼容性解析

1.问题描述 最近在实现通过Java爬虫获取网页源码&#xff0c;然后紧接着将源码转换为图片上传到OSS服务器&#xff0c;其中探索了很多办法&#xff0c;但是在实现过程中遇到一个奇葩问题&#xff0c;就是我无论下载任何Maven依赖&#xff0c;都无法正常下载&#xff0c;简直是…

LeetCode1207独一无二的出现次数

题目描述 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 解析 正常的解法肯定是对每个元素使用一个hashmap&#xff0c;存元素及出现次数&#xff0c;然后通…

如何压缩图片大小?7个实用软件教你快速压缩图片大小

如何压缩图片大小&#xff1f;7个实用软件教你快速压缩图片大小 以下是七个实用的软件&#xff0c;可以帮助您快速压缩图片大小&#xff1a; 图片编辑助手&#xff1a;这是一款功能强大的图像处理软件&#xff0c;其中包含了图像压缩功能。您可以打开需要压缩的图片&#xf…

工业物联网解决方案:机房动环监控系统

工业物联网解决方案&#xff1a;机房动环监控系统 工业物联网&#xff08;IIoT&#xff09;作为数字化转型的关键驱动力&#xff0c;正深刻改变着各行各业的运作模式&#xff0c;其中机房动环监控系统是实现智能化运维管理的重要组成部分。该系统通过集成传感器技术、大数据分…

macOS上使用qt creator编译调试ffmpeg.c

1 前言 上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法&#xff0c;这里列举另外一种办法&#xff0c;就是用qt creator来完成这件事情。 编译环境如下&#xff1a; qt creator 9.0.2&#xff1b;ffmpeg release/6.1; 2 编译ffmpeg.c 大…