数据新探:用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 = 5

for attempt in range(max_attempts):
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            print('请求成功!')
            break
        else:
            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数据库中。


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基准电流源电路仿真

1.补全电路 2.更改vpluse属性 3.添加tran仿真&#xff0c;因为加入启动电路主要看的就是tran仿真 4.启动仿真 5.看电路曲线 先点这个main form 不用选择ok&#xff0c;直接点中四条线&#xff0c;中间第2条曲线如果出现那样一个小波动后面没有起伏就说明成功了。

一篇文章带你入门CSRF

1.什么是CSRF 用一个形象生动的比喻就是&#xff1a; 你给朋友的房子留下了备用钥匙&#xff0c;但是有人偷偷拿走了这把钥匙&#xff0c;然后用这把钥匙进入了你朋友的房子并做了各种坏事。你朋友以为只有你能使用这把钥匙&#xff0c;所以没对任何操作产生怀疑。 在这个比…

.NET周刊【5月第2期 2024-05-12】

国内文章 C#在工业数字孪生中的开发路线实践 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 这篇文章探讨了C#在工业数字孪生技术中的应用&#xff0c;介绍了三种基于C#的数字孪生系统实现方案&#xff1a; WPF Unity&#xff1a;结合WPF技术和Unity引擎&#xff0c…

算法练习day8

反转字符串 代码随想录 0344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.05小时&#xff09; 思路 这道题很简单也很经典。 字符串的反转方法有很多&#xff0c;我这里是用for循环通过数组长度和下标计算来交换。…

如何用Rust获取CPU、内存、硬盘的信息?

目录 一、用Rust获取CPU、内存、硬盘的信息 二、知识点 systemstat 一、用Rust获取CPU、内存、硬盘的信息 首先&#xff0c;需要添加systemstat库到Cargo.toml文件&#xff1a; [dependencies] systemstat "0.2.3" 在Rust代码中使用它&#xff1a; extern crat…

pip镜像源

1.1 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple 1.2 阿里云 https://mirrors.aliyun.com/pypi/simple/ 1.3 网易 https://mirrors.163.com/pypi/simple/ 1.4 豆瓣 https://pypi.douban.com/simple/ 1.5 百度云 https://mirror.baidu.com/pypi/simple/ 1.6 中科大 ht…

Android 集成Bugly完成线上的异常Exception收集及处理

文章目录 &#xff08;一&#xff09;添加产品APP&#xff08;二&#xff09;集成SDK&#xff08;三&#xff09;参数配置权限混淆 &#xff08;四&#xff09;初始化 &#xff08;一&#xff09;添加产品APP 一&#xff09;在个人头像 -> 我的头像 -> 新建产品 二&…

基于IDEA快速创建一个SpringMVC项目并且配置Tomcat

1&#xff0c;打开IDEA&#xff0c;新建Maven项目【使用web模板创建】 使用社区版的同学创建普通的maven项目&#xff0c;并配置项目的webapp&#xff0c;详情可参考 快速创建一个SpringMVC项目&#xff08;IDEA&#xff09; 2&#xff0c;在main目录下创建Java和resource目录…

原生小程序开发如何使用 tailwindcss

原生小程序开发如何使用 tailwindcss 原生小程序开发如何使用 tailwindcss 前言什么是 weapp-tailwindcss ?0. 准备环境以及小程序项目1. 安装与配置 tailwindcss 0. 使用包管理器安装 tailwindcss1. 在项目目录下创建 postcss.config.js 并注册 tailwindcss2. 配置 tailwind…

24深圳杯B题42页高质量论文+可执行代码+可视化图标(更新版)

简单麦麦https://www.jdmm.cc/file/2710640/ 比赛题目的完整版思路代码数据都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff…

灌区信息化管理平台系统包含哪些内容?(全面介绍)

政策背景 2022年12月29日&#xff0c;水利部启动48处大中型灌区开展数字孪生灌区先行先试建设。 2023年2月24日&#xff0c;《2023年农村水利水电工作要点》:2023年农村水利水电工作的总体思路包括:紧盯保障国家粮食安全&#xff0c;加快推进大中型灌区现代化改造&#xff0c;…

1. AB路线-BFS+分层图

0AB路线 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> #define int long long #define endl \n using namespace std; int n,m,k; //存迷宫格子 char board[1005][1005]; //vis[i][j][k]存坐标(i,j)的格子&#xff0c;在一个周期中第k次经过它 bool vis[1005][1005][…

linux 网络管理 实验

目录 网络管理主机名管理网络管理 网络管理 主机名管理 执行如下命令查看主机名。 [rootopenEuler ~]# hostname openEuler [rootopenEuler ~]# cat /etc/hostname #这个文件是主机名的配置文件 openEuler执行如下命令临时修改主机名。 [rootopenEuler ~]# hostname huawe…

(四十二)第 6 章 树和二叉树(树的二叉链表(孩子-兄弟)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

MySQL的msi格式安装

一、下载链接 MySQL :: Download MySQL Installer (Archived Versions) 二、安装步骤 ①选择自定义安装 ②选择要安装的产品 ③安装依赖环境 ④安装 ⑤点击下一步 ⑥配置 ⑦设置密码 ⑧命名 ⑨数据存放路径 ⑩安装配置 ①①配置环境变量 ①②验证 方法一&#xff1a; 方法二…

【软考】设计模式之桥接模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.将抽象部分与其实现部分分离&#xff0c;使它们都可以独立地变化。2.桥接模式&#xff08;Bridge Pattern&#xff09;属于对象结构型模式&#xff0c;又称为柄体&#xff08;Handle an…

C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)

文章目录 将C#对象转换为json字符串Newtonsoft模块的安装用Newtonsoft将对象转换为json字符串 将json字符串转换为C#对象 将C#对象转换为json字符串 本介绍将基于C#中的第三方库Newtonsoft进行&#xff0c;因此将分为Newtonsoft模块的安装和使用两部分。该模块的优势在于只需要…

PCB笔记(二十六):PCB检查

前言 首先检查元器件是否100&#xff05; 放置 文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bo…

node安装以及node的包管理工具

node安装以及node的包管理工具 node安装nvm管理工具 node安装 1、下载node链接: 点击这里 2、选择需要下载的版本以及对应的系统版本 nvm管理工具 1、下载nvm链接: 点击这里 2、双击运行.exe文件 全部默认安装即可 3、nvm常用命令 nvm list avaliable 显示所有可以下载的n…

umi项目配置之项目构建时配置umirc.ts

对于 umi 中能使用的自定义配置&#xff0c;你可以使用项目根目录的 .umirc.ts 文件或者 config/config.ts&#xff0c;值得注意的是这两个文件功能一致&#xff0c;仅仅是存在目录不同&#xff0c;2 选 1 &#xff0c;.umirc.ts 文件优先级较高 umi 的配置文件是一个正常的 n…