lxml库和Xpath提取网页数据的基础与实战:完整指南与实战【第92篇—提取网页】

news2024/7/4 2:19:28

使用lxml库和Xpath提取网页数据的基础与实战

在网络爬虫和数据抓取中,从网页中提取所需信息是一项常见的任务。lxml库和Xpath是Python中用于解析和提取HTML/XML数据的强大工具。本文将介绍lxml库的基础知识,以及如何使用Xpath表达式来准确地提取网页数据。

image-20240222110354600

lmxl库简介

lxml是一个用于处理XML和HTML的Python库,它基于C语言的libxml2和libxslt。lxml提供了一个简单而强大的API,使得解析和操作HTML/XML文档变得相对容易。

首先,确保你已经安装了lxml库:

pip install lxml

lmxl库的基础用法

解析HTML/XML文档

from lxml import etree

# 从字符串解析HTML
html_string = "<html><body><div>Hello, World!</div></body></html>"
html_tree = etree.fromstring(html_string)

# 从文件解析HTML
file_path = "path/to/your/file.html"
html_tree = etree.parse(file_path)

Xpath表达式

Xpath是一种用于在XML文档中定位节点的语言。通过结合lxml库,我们可以使用Xpath表达式来选择和提取数据。

以下是一些常见的Xpath表达式示例:

  • 选取所有的<div>元素://div
  • 选取具有特定class属性的<div>元素://div[@class='classname']
  • 选取第一个<div>元素://div[1]

代码实战:提取网页数据

让我们通过一个实际的例子来演示如何使用lxml和Xpath来提取网页数据。假设我们要从一个简单的HTML页面中提取新闻标题和链接。

import requests
from lxml import etree

# 发送HTTP请求获取网页内容
url = "https://example.com/news"
response = requests.get(url)
html_content = response.text

# 解析HTML内容
html_tree = etree.HTML(html_content)

# 使用Xpath提取新闻标题和链接
titles = html_tree.xpath("//h2[@class='news-title']/a/text()")
links = html_tree.xpath("//h2[@class='news-title']/a/@href")

# 打印提取结果
for title, link in zip(titles, links):
    print(f"Title: {title}\nLink: {link}\n")

在上述代码中,我们首先使用requests库获取网页内容,然后使用lxml的etree.HTML()方法解析HTML。接下来,通过Xpath表达式选择新闻标题和链接,并最终打印出提取的结果。

这是一个简单的例子,实际应用中,你可能需要根据具体网页的结构调整Xpath表达式以适应不同的情况。

通过学习lxml库和Xpath,你可以更轻松地处理和提取网页数据,为你的爬虫和数据抓取任务提供强大的工具。希望这篇文章能帮助你更好地理解和应用这些技术。

进阶用法:处理动态加载和命名空间

在实际的网络爬虫中,经常会遇到动态加载的内容或者命名空间的情况。lxml同样提供了解决这些问题的方法。

处理动态加载内容

有时,网页上的数据是通过JavaScript动态加载的,这样的情况下,通过简单的HTTP请求无法获取到完整的页面内容。可以使用Selenium等工具模拟浏览器行为,或者使用开发者工具分析Ajax请求,然后发送相应的请求获取数据。

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
from lxml import etree

# 使用Selenium获取动态加载内容
url = "https://example.com/dynamic-page"
driver = webdriver.Chrome()
driver.get(url)

# 等待数据加载完成
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='dynamic-content']")))

# 获取页面内容
html_content = driver.page_source

# 关闭浏览器
driver.quit()

# 解析HTML内容
html_tree = etree.HTML(html_content)

# 使用Xpath提取数据
# ...

处理命名空间

有时,XML文档中可能包含命名空间,这会使Xpath表达式更加复杂。可以使用register_namespace方法来处理命名空间。

from lxml import etree

# 解析包含命名空间的XML文档
xml_string = """<root xmlns:ns="http://example.com"><ns:element>Value</ns:element></root>"""
xml_tree = etree.fromstring(xml_string)

# 注册命名空间
etree.register_namespace("ns", "http://example.com")

# 使用Xpath提取带命名空间的元素
result = xml_tree.xpath("//ns:element/text()", namespaces={"ns": "http://example.com"})

# 打印提取结果
print(result)

在这个例子中,我们使用register_namespace方法注册了命名空间,然后在Xpath表达式中使用了命名空间前缀。

通过掌握这些进阶用法,你可以更灵活地应对各种复杂的网页结构和数据提取需求,提高爬虫的适用性和鲁棒性。

错误处理和异常处理

在实际的网络爬虫任务中,经常会面临各种异常情况,如网络连接错误、页面结构变化等。为了确保你的爬虫具有良好的鲁棒性,需要实施适当的错误处理和异常处理机制。

import requests
from lxml import etree

url = "https://example.com/news"

try:
    # 发送HTTP请求获取网页内容
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text

    # 解析HTML内容
    html_tree = etree.HTML(html_content)

    # 使用Xpath提取数据
    titles = html_tree.xpath("//h2[@class='news-title']/a/text()")
    links = html_tree.xpath("//h2[@class='news-title']/a/@href")

    # 打印提取结果
    for title, link in zip(titles, links):
        print(f"Title: {title}\nLink: {link}\n")

except requests.exceptions.RequestException as e:
    print(f"Error during the request: {e}")

except etree.XPathError as e:
    print(f"Error in XPath expression: {e}")

except Exception as e:
    print(f"An unexpected error occurred: {e}")

在上述代码中,我们使用了tryexcept块,分别捕获了requests库可能引发的请求异常和lxml库可能引发的XPath异常。此外,还有一个通用的Exception块,用于捕获其他未预料到的异常。这样,即使在爬虫执行过程中发生了异常,程序也能够 gracefully 处理并给出相应的提示,提高了爬虫的健壮性。

降低爬虫频率和模拟人类行为

在爬取网页数据时,过于频繁的请求可能会导致IP被封禁或者对方服务器的反爬虫机制生效。为了避免这种情况,可以通过设置合适的请求头和模拟人类行为来降低爬虫的频率。

import requests
import time
from random import randint

url = "https://example.com/news"

# 设置请求头,模拟浏览器访问
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:
    # 发送HTTP请求获取网页内容
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text

    # 解析HTML内容
    # ...

    # 模拟人类行为,随机休眠一段时间
    time.sleep(randint(1, 5))

except requests.exceptions.RequestException as e:
    print(f"Error during the request: {e}")

except Exception as e:
    print(f"An unexpected error occurred: {e}")

在上述代码中,我们通过设置了User-Agent请求头来模拟浏览器的请求,并使用time.sleep()函数来随机休眠一段时间,以模拟人类的访问行为。这有助于降低爬虫的频率,减轻服务器负担,同时避免被封禁的风险。

通过合理设置请求头和模拟人类行为,你可以更好地与目标网站协同工作,提高爬虫的稳定性和可靠性。

存储爬取数据

一旦成功提取了网页数据,你可能希望将数据保存到本地文件或者数据库中以供后续分析或使用。以下是一些存储爬取数据的示例。

存储到本地文件

import requests
from lxml import etree

url = "https://example.com/news"

try:
    # 发送HTTP请求获取网页内容
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text

    # 解析HTML内容
    html_tree = etree.HTML(html_content)

    # 使用Xpath提取数据
    titles = html_tree.xpath("//h2[@class='news-title']/a/text()")
    links = html_tree.xpath("//h2[@class='news-title']/a/@href")

    # 存储到本地文件
    with open("news_data.txt", "w", encoding="utf-8") as file:
        for title, link in zip(titles, links):
            file.write(f"Title: {title}\nLink: {link}\n\n")

except requests.exceptions.RequestException as e:
    print(f"Error during the request: {e}")

except etree.XPathError as e:
    print(f"Error in XPath expression: {e}")

except Exception as e:
    print(f"An unexpected error occurred: {e}")

在这个例子中,我们使用with open()语句将提取的标题和链接写入到本地文件 “news_data.txt” 中,每个新闻之间空一行。这是一个简单的文本存储方式,适用于小规模的数据。

存储到数据库

如果你需要处理大量数据或者进行更复杂的数据管理,可以考虑将数据存储到数据库中。

import requests
from lxml import etree
import sqlite3

url = "https://example.com/news"

try:
    # 发送HTTP请求获取网页内容
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text

    # 解析HTML内容
    html_tree = etree.HTML(html_content)

    # 使用Xpath提取数据
    titles = html_tree.xpath("//h2[@class='news-title']/a/text()")
    links = html_tree.xpath("//h2[@class='news-title']/a/@href")

    # 存储到SQLite数据库
    with sqlite3.connect("news_database.db") as connection:
        cursor = connection.cursor()

        # 创建表
        cursor.execute("CREATE TABLE IF NOT EXISTS news (title TEXT, link TEXT)")

        # 插入数据
        for title, link in zip(titles, links):
            cursor.execute("INSERT INTO news (title, link) VALUES (?, ?)", (title, link))

except requests.exceptions.RequestException as e:
    print(f"Error during the request: {e}")

except etree.XPathError as e:
    print(f"Error in XPath expression: {e}")

except Exception as e:
    print(f"An unexpected error occurred: {e}")

在这个例子中,我们使用了SQLite数据库,通过连接、创建表和插入数据的方式将爬取的新闻标题和链接存储到数据库中。这种方式更适用于大规模数据以及需要进行复杂查询和分析的情况。

无论你选择哪种方式,存储爬取数据是网络爬虫流程中的重要一步,有助于将数据持久化并方便后续处理。

持续改进与优化

网络爬虫是一个不断学习和优化的过程。在实际应用中,你可能会面临各种情况,例如网站的反爬虫机制、数据结构的变化等。在不断改进与优化中,保持灵活性和适应性是非常重要的。

  • 定期更新Xpath表达式: 网页结构可能会发生变化,导致之前编写的Xpath表达式失效。定期检查并更新Xpath表达式,以适应网页的变化。

  • 处理动态加载内容: 如果网页采用JavaScript动态加载内容,可能需要使用Selenium等工具来模拟浏览器行为,或者通过分析Ajax请求获取数据。

  • 监控爬虫行为: 确保你的爬虫行为合法且符合网站的使用政策。可以使用合适的爬虫框架或工具,以及设置合理的请求频率,避免被封禁或触发反爬虫机制。

  • 处理异常情况: 不同的网站和网络环境可能导致不同类型的异常。根据实际情况完善异常处理机制,提高爬虫的健壮性。

通过持续改进与优化,你将能够构建出更加稳定、高效且可维护的网络爬虫系统。祝愿你在爬虫的旅程中取得更多的成功与经验!

部署爬虫和定时任务

在完成网络爬虫的开发和优化后,你可能希望将爬虫部署到服务器上,并设置定时任务以定期执行爬取任务。这样可以确保你的数据始终是最新的,并且无需手动运行爬虫。

部署到服务器

将爬虫部署到服务器上,可以选择使用云服务(如AWS、Azure、Google Cloud等)或者自己的服务器。确保服务器环境中已经安装了所需的Python环境和相关依赖库。

# 安装依赖库
pip install requests lxml

将你的爬虫代码和相关文件上传到服务器,然后通过终端进入相应的目录,运行你的爬虫脚本。

python your_crawler_script.py

设置定时任务

使用定时任务工具(如cron)可以让你的爬虫在指定的时间间隔内自动运行。在终端中运行以下命令,编辑定时任务表:

crontab -e

添加一行以指定定时任务的执行频率和执行命令。例如,每天凌晨执行一次爬虫:

0 0 * * * python /path/to/your_crawler_script.py

这表示在每天的 00:00 执行指定的Python脚本。你可以根据需求调整执行频率和具体执行命令。

日志记录

在爬虫运行期间,记录日志是非常有用的,可以帮助你追踪爬取过程中的问题,并及时发现异常。使用Python内置的logging模块可以方便地实现日志记录。

import logging

# 配置日志
logging.basicConfig(filename='crawler_log.txt', level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')

try:
    # 爬虫逻辑
    # ...

    # 记录成功信息
    logging.info("Crawling job completed successfully.")

except Exception as e:
    # 记录错误信息
    logging.error(f"An error occurred: {e}")

通过将日志记录到文件中,你可以随时查看爬虫的运行情况,从而更容易发现和解决问题。

安全性注意事项

在爬虫开发和部署过程中,务必注意以下安全性问题:

  • 尊重网站的robots.txt文件: 确保你的爬虫遵守目标网站的robots.txt协议,以避免对方封禁你的IP地址。

  • 模拟人类行为: 使用合适的请求头、随机休眠等方式,模拟人类访问行为,以减少被识别为爬虫的风险。

  • 合法性和道德性: 确保你的爬虫行为是合法的,并遵循相关法律法规。爬取内容时要考虑到道德和隐私问题。

  • 用户代理设置: 使用合适的用户代理(User-Agent),避免使用明显的爬虫标识,以减轻被封禁的可能性。

通过谨慎处理这些安全性问题,可以确保你的爬虫在进行数据抓取的同时,与目标网站保持友好关系,避免引起不必要的问题。

监控与通知

一旦爬虫被部署并设置了定时任务,实时监控爬虫的运行状况并及时处理异常情况是非常重要的。这可以通过引入监控和通知机制来实现。

添加监控机制

可以使用一些监控工具或服务来跟踪你的爬虫运行情况。一些常见的监控项包括:

  • 运行状态: 爬虫是否正常运行,是否出现异常。
  • 内存和CPU使用率: 检查爬虫运行时的系统资源消耗,确保不会导致服务器负载过高。
  • HTTP请求状态码: 监控爬虫请求目标网站时的HTTP状态码,及时发现访问问题。
  • 爬虫速率: 检查爬虫的访问速率,避免频繁请求导致被封禁。

设置通知机制

一旦监控系统检测到异常,可以通过设置通知机制及时通知相关人员。常见的通知方式包括:

  • 邮件通知: 使用邮件服务发送爬虫运行状态的通知。
  • 短信通知: 通过短信服务发送紧急通知。
  • 消息推送: 使用消息推送服务(如Telegram、Slack等)发送即时通知。

以下是一个简单的监控和通知的示例,使用Python的smtplib库发送邮件通知:

import smtplib
from email.mime.text import MIMEText

def send_email(subject, body):
    sender_email = "your_email@gmail.com"
    receiver_email = "recipient_email@gmail.com"
    password = "your_email_password"

    message = MIMEText(body)
    message["Subject"] = subject
    message["From"] = sender_email
    message["To"] = receiver_email

    with smtplib.SMTP("smtp.gmail.com", 587) as server:
        server.starttls()
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, message.as_string())

# 在发生异常时发送邮件通知
try:
    # 爬虫逻辑
    # ...

except Exception as e:
    # 记录错误信息
    error_message = f"An error occurred: {e}"

    # 发送邮件通知
    send_email("爬虫异常通知", error_message)

在这个例子中,当爬虫发生异常时,会发送一封包含错误信息的邮件通知到指定邮箱。你可以根据需要调整通知的方式和内容。

整合监控服务

除了自行实现监控和通知,还可以使用专业的监控服务,如Prometheus、Datadog、New Relic等。这些服务提供了丰富的监控和告警功能,能够更方便地管理和跟踪爬虫的运行状态。

通过引入监控和通知机制,可以在爬虫运行过程中及时发现问题,采取相应的措施,提高系统的可靠性和稳定性。

持续改进与优化

随着爬虫的运行,你可能会面临新的挑战和问题。持续改进与优化是一个迭代的过程,可以通过以下方式不断提升爬虫系统的性能和可维护性:

  • 日志分析: 定期分析爬虫的日志,发现并解决潜在问题,了解爬虫运行状况。

  • 性能优化: 根据监控数据,进行性能优化,提高爬虫的效率和响应速度。

  • 定期更新爬虫: 网页结构和反爬虫策略可能会发生变化,定期更新爬虫以适应新的情况。

  • 持续学习: 了解新的技术和工具,不断学习优化爬虫的方法,保持在领域的竞争力。

通过不断改进和优化,你将能够构建出更加稳定、高效且可维护的网络爬虫系统。祝愿你在爬虫的旅程中取得更多的成功与经验!

数据处理与分析

当你成功地爬取了大量的数据后,接下来的关键步骤是对这些数据进行处理和分析。这将有助于你从海量信息中提炼出有用的见解,为业务决策提供支持。

数据清洗与预处理

爬取的数据可能包含一些错误、缺失或不规范的信息。在进行分析之前,需要进行数据清洗和预处理。

import pandas as pd

# 假设你已经将爬取的数据存储在CSV文件中
df = pd.read_csv('news_data.csv')

# 数据清洗:处理缺失值、去重、处理异常值等
df = df.drop_duplicates()  # 去重
df = df.dropna()  # 删除缺失值

# 预处理:转换数据类型、提取关键信息等
df['Date'] = pd.to_datetime(df['Date'])  # 将日期列转为日期类型
df['Title_Length'] = df['Title'].apply(len)  # 添加标题长度列

在这个例子中,我们使用了Python的pandas库进行数据处理。可以根据具体的数据情况进行更复杂的清洗和预处理操作。

数据分析

一旦数据经过清洗和预处理,就可以进行各种分析操作了。以下是一些常见的数据分析任务:

统计信息
# 查看数据的统计信息
summary = df.describe()
print(summary)
排序和筛选
# 按日期排序
df_sorted = df.sort_values(by='Date', ascending=True)

# 根据条件筛选数据
df_filtered = df[df['Title_Length'] > 10]
分组与聚合
# 按月份统计新闻数量
df['Month'] = df['Date'].dt.to_period('M')
news_count_by_month = df.groupby('Month').size()
可视化
import matplotlib.pyplot as plt

# 绘制新闻数量随时间的趋势图
plt.plot(df['Date'], df.index)
plt.xlabel('Date')
plt.ylabel('News Count')
plt.title('News Count Trend')
plt.show()

数据存储

分析完数据后,可以将结论或需要进一步使用的数据存储下来。

# 将分析结果保存为CSV文件
summary.to_csv('data_summary.csv', index=False)

自动化数据处理与分析

为了实现更高效的数据处理与分析,你可以将上述过程进行自动化,使其成为一个独立的数据处理流程。可以使用Airflow、Luigi等任务调度工具,或者编写脚本进行定期执行。

# 自动执行数据处理与分析脚本
# data_processing_and_analysis.py
import pandas as pd
import matplotlib.pyplot as plt

def data_processing_and_analysis(file_path):
    # 读取数据
    df = pd.read_csv(file_path)

    # 数据清洗与预处理
    df = df.drop_duplicates()
    df = df.dropna()
    df['Date'] = pd.to_datetime(df['Date'])
    df['Title_Length'] = df['Title'].apply(len)

    # 数据分析
    summary = df.describe()
    news_count_by_month = df.groupby(df['Date'].dt.to_period('M')).size()

    # 可视化
    plt.plot(df['Date'], df.index)
    plt.xlabel('Date')
    plt.ylabel('News Count')
    plt.title('News Count Trend')
    plt.savefig('news_count_trend.png')

    # 保存结果
    summary.to_csv('data_summary.csv', index=False)
    news_count_by_month.to_csv('news_count_by_month.csv')

# 在定时任务中调用
data_processing_and_analysis('news_data.csv')

通过将数据处理与分析流程封装成函数或脚本,并定期执行,你可以更方便地管理和维护整个数据处理与分析的流程。

数据可视化与报告

一旦完成数据处理与分析,接下来的关键步骤是将结果以清晰而有力的方式呈现出来。数据可视化和撰写报告是与他人分享你的发现和见解的有效手段。

数据可视化

使用数据可视化工具(如Matplotlib、Seaborn、Plotly等)可以将分析结果转化为易于理解和传达的图表。

import matplotlib.pyplot as plt

# 绘制新闻数量随时间的趋势图
plt.plot(df['Date'], df.index)
plt.xlabel('Date')
plt.ylabel('News Count')
plt.title('News Count Trend')
plt.show()

除了趋势图,你还可以创建条形图、饼图、热力图等,根据数据的特点选择最合适的可视化方式。

报告撰写

将你的发现整理成报告,以便他人能够理解你的工作和结论。一个完整的报告通常包括以下内容:

  1. 简介: 介绍你的研究目的、爬取的数据来源和研究问题。

  2. 数据收集: 描述你的爬虫如何工作,爬取了哪些数据。

  3. 数据清洗与预处理: 说明你对数据进行了哪些清洗和预处理操作。

  4. 数据分析: 展示你的分析结果,包括统计信息、趋势图、重要发现等。

  5. 结论: 总结你的研究结果,回答研究问题。

  6. 建议和展望: 提出对数据的进一步研究建议,并展望未来的工作方向。

利用Jupyter Notebook

Jupyter Notebook是一个交互式计算环境,可以在其中编写和执行代码,同时添加文本、图表等元素,非常适合撰写数据分析报告。

# 在Jupyter Notebook中展示趋势图
import matplotlib.pyplot as plt

plt.plot(df['Date'], df.index)
plt.xlabel('Date')
plt.ylabel('News Count')
plt.title('News Count Trend')
plt.show()

将报告保存为Jupyter Notebook的形式,你可以分享整个Notebook,使其他人能够轻松地复现你的分析过程。

利用Dashboard工具

使用Dashboard工具(如Tableau、Power BI等)可以创建交互式的仪表板,更灵活地展示和探索数据。

这些工具通常支持从数据源直接连接和导入数据,同时提供各种图表和过滤器,使用户能够自由地进行数据探索。

发布与分享

一旦你的报告和可视化结果准备好,你可以选择不同的方式发布和分享:

  1. 在线平台: 将报告和可视化上传到在线平台,如GitHub、GitLab、Jupyter Notebooks Viewer等,以便他人可以直接查看。

  2. 内部分享: 如果你的研究是为公司或团队进行的,可以在内部分享会议上演示你的报告和发现。

  3. 博客文章: 将你的研究写成博客文章,并分享在个人博客或专业社区中,与其他人交流。

  4. 会议和研讨会: 如果你的研究有足够的深度和重要性,可以考虑提交到相关领域的学术会议或研讨会上,与同行进行交流。

  5. 社交媒体: 利用社交媒体平台分享你的发现,吸引更多关注和反馈。

通过合适的发布和分享方式,你的研究成果将得到更广泛的认可和应用。

总结

在网络爬虫任务中,数据可视化和报告撰写是非常重要的环节,它们帮助你向其他人传达你的发现和见解。通过选择合适的可视化工具和报告撰写方式,你可以更有效地分享你的研究成果,推动业务决策的制定和执行。希望这些建议能够帮助你成功地展示你的网络爬虫研究。祝愿你的报告和可视化工作取得成功!

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

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

相关文章

Java----认识异常

目录 一、异常的概念与体系结构 1.异常的概念 2.异常的体系结构 3.异常的分类 1. 编译时异常 2. 运行时异常 二、异常的处理 1.认识防御式编程 2.异常的抛出 3.异常的捕获 3.1 异常声明throws throws与throw的区别&#xff1a; 3.2 try-catch捕获并处理 3.3 finally …

unity学习(38)——创建(create)角色脚本(panel)--EventSystem

1.在scripts文件夹下创建一个脚本CreatePlayerPanel.cs&#xff0c;脚本挂到panel上&#xff01;给panel加个tag&#xff0c;叫createPanel&#xff0c;脚本内容如下&#xff1a; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngin…

华为配置WLAN AC和AP之间VPN穿越示例

配置WLAN AC和AP之间VPN穿越示例 组网图形 图1 配置WLAN AC和AP之间VPN穿越示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响…

redis的搭建 RabbitMq搭建 Elasticsearch 搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

2024年最值得尝试的创业项目,利用信息差,普通人下班也能做

大家好&#xff0c;我是电商花花。 到了2024年&#xff0c;人们依然在寻找长期可靠的副业项目&#xff0c;但我建议暂时停一下&#xff0c;因为抖音小店这个轻松暴利的副业项目还在等着我们呢。 抖音小店无货源创业项目作为一个轻资产创业项目&#xff0c;操作简单&#xff0…

pi(2)

上一次我们说到了这个程序 #include <iostream> #include <cmath> #include <limits> int continuedFractionTerm(int n) { if (n 0) return 1; if (n % 2 0) { return 2 * n 1; } else { return 2 * n; } } std::pair<int, int> be…

大模型参数高效微调

参数高效微调目的 PEFT技术旨在通过最小化微调参数的数量和计算复杂度&#xff0c;来提高预训练模型在新任务上的性能&#xff0c;从而缓解大型预训练模型的训练成本。这样一来&#xff0c;即使计算资源受限&#xff0c;也可以利用预训练模型的知识来迅速适应新任务&#xff0…

bat脚本检测进程程序的方法

一、脚本检测进程 使用批处理脚本检测程序是否在运行&#xff0c;可以使用tasklist命令来列出当前运行的所有进程&#xff0c;并通过findstr命令来搜索特定的进程名。下面是一个简单的批处理脚本示例&#xff0c;它会检测指定的程序是否在运行&#xff0c;并给出相应的信息&…

python 基础知识点(蓝桥杯python科目个人复习计划49)

今日复习内容&#xff1a;做复习题 例题1&#xff1a;希尔排序 题目描述&#xff1a; 希尔排序是直接插入排序算法的一种更高效的改进版本&#xff0c;但它是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出的改进方法之一&#xff1a; 1.插入排序在对几乎已经…

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

【前端素材】推荐优质后台管理系统Airmin平台模板(附源码)

一、需求分析 系统定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心&#xff0c;管理员可以通过后台系统进行各种管…

中国农业无人机行业市场现状分析与投资前景预测研究报告

全版价格&#xff1a;壹捌零零 报告版本&#xff1a;下单后会更新至最新版本 交货时间&#xff1a;1-2天 第一章农业无人机行业发展综述 第一节农业无人机行业定义及分类 一、农业无人机行业的定义 农业无人机是一种无人驾驶的飞行器来帮助优化农业经营&#xff0c;增加作…

jetson nano——报错(已解决):ModuleNotFoundError: No module named ‘wx‘

目录 1.问题描述&#xff1a;2.报错&#xff0c;如下图&#xff1a;3.**解决&#xff1a;得安装一些wxpython的依赖&#xff0c;然后自己编译**3.1 wxPython链接4.编译过程中的图片&#xff1a;&#xff08;用时48min.....流泪&#xff09;5.编译完成以后的图片6.验证结果7.这是…

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传&#xff0c;数据线却不在身边&#xff0c;这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品&#xff0c;免费且功能强大&#xff0c;被很多人誉为是“全能文件管理器”。 1.在手机上…

【JavaEE】_smart tomcat常见问题

目录 1. 插件安装故障问题 2. 端口占用问题 3. 乱码问题 1. 插件安装故障问题 如果由于网络问题在IDEA中无法直接安装插件&#xff0c;可以去IDEA官网进行下载&#xff1a; 进入官网后点击Install安装&#xff0c;得到一个jar包&#xff1a; 把jar包拖拽到idea上即可自动安装…

职业规划,电气工程师的岗位任职资格

电气工程技术人员主要是指精通电气施工技术&#xff0c;从事与电气产相关研发工作并能够解决实际问题&#xff0c;对相关资源进行最终统筹的人员。一般来说&#xff0c;这类人员主要从事绘制、审核和把关电气图纸的工作&#xff0c;在审核电气图纸的时候&#xff0c;会检查施工…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中&#xff0c;application.properties 和 application.yml 文件用于配置应用程序的各个方面&#xff0c;如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件&#xff0c;位于 src/main/resources 目录下。 application.properties 示例 …

Linux--ACL权限管理

一.ACL权限管理简介 ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种文件权限管理机制&#xff0c;它提供了比传统的UGO&#xff08;用户、组、其他&#xff09;权限更灵活的权限设置方式。以下是ACL的一些主要功能&#xff1a; 针对特定用户或…

[力扣 Hot100]Day33 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 出处 思路 归并排序即可。 代码 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…