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

爬虫 - 二手交易电商平台数据采集 (一)

背景: 近期有一个需求需要采集某电商网站平台的商品数据进行分析。因此,我计划先用Python实现一个简单的版本,以快速测试技术的实现可能性,再用PHP实现一个更完整的版本。文章中涉及的技术仅为学习和测试用途,请勿用于商业或非法用途,以免对相关网站服务器造成不良影响。

一、需求分析

在网页抓取过程中,需要留意有些网站使用了动态渲染技术,这意味着页面内容并不是初始加载时直接从服务器获取,而需要JavaScript渲染后才会显示完整内容。应对动态渲染页面时,我们可以采用以下几种方法来获取数据:

1. 使用 Selenium

Selenium 是一种自动化测试框架,可模拟用户在浏览器中执行操作,获取渲染后的页面内容。它适合处理需要登录、填写表单等复杂的页面交互。使用 Selenium WebDriver 可以控制浏览器自动加载页面、执行 JavaScript 代码等,以便抓取到动态渲染的数据。

优缺点

  • 优点:适合复杂交互场景,如模拟登录、表单提交,能完整抓取动态内容。
  • 缺点:需要开启浏览器,消耗资源较大,速度相对较慢。

2. 使用 Headless 浏览器

Headless 浏览器没有图形界面,但具备处理JavaScript、HTML、CSS等渲染能力,是抓取动态渲染页面的理想选择。常见的 Headless 浏览器有 PhantomJS 和 Puppeteer。

优缺点

  • 优点:不需要可视化界面,效率较高,且可以完整执行JavaScript。
  • 缺点:对于需要频繁交互的操作不如 Selenium 灵活。

3. 直接调用网站 API

部分网站提供公开 API 接口,直接向这些接口发送请求即可获取数据,省去渲染页面的步骤。可以使用抓包工具找到这些接口的请求数据,直接模拟请求参数。

优缺点

  • 优点:相比前两种方法,调用 API 更高效、直接,适合抓取特定数据。
  • 缺点:某些 API 可能会有访问限制或加密,且并非所有网站提供公开 API。

4. 分析 JavaScript 渲染逻辑

一些网站通过 JavaScript 动态生成内容时,可以分析页面源代码,找到生成页面的 JS 代码块,模拟执行获取数据。这种方法对没有 API 接口且较复杂的动态页面尤其适用,但对开发者的 JavaScript 分析能力有较高要求。

优缺点

  • 优点:适合特定没有 API 且动态生成内容的网站。
  • 缺点:需要较高的分析和 JS 知识。

案例网站

本次我们选择了日本的二手交易平台 mercari.com 进行数据抓取。经分析页面结构,发现其采用了动态渲染,适合使用 Selenium + Chrome 浏览器模拟获取数据。


二、Selenium 介绍

1. 什么是 Selenium

Selenium 是一个强大的开源工具集,最初设计用于 Web 应用程序的自动化测试,后来也被广泛应用于网页抓取(Web Scraping)。通过 Selenium,程序可以自动控制浏览器,就像用户手动操作一样,执行各种交互,如点击、输入文本、滚动页面等。Selenium 的核心组件是 WebDriver,它负责与浏览器进行交互。

Selenium 的工作原理:

  • WebDriver 是 Selenium 的核心,它通过与浏览器的 “驱动程序”(如 ChromeDriver、GeckoDriver)进行通信来控制浏览器。WebDriver 会将程序指令转换成浏览器能够识别的命令,模拟用户操作。
  • WebDriver 通过 HTTP 协议发送指令,这些指令被浏览器驱动(如 ChromeDriver)接收、解析,并在浏览器中执行。执行完成后,驱动程序将执行结果返回给 WebDriver。
  • 例如,当程序发送一个点击按钮的指令时,WebDriver 会发送 HTTP 请求给驱动,驱动再将该指令转换为浏览器能识别的点击操作。

2. 在代码中如何使用 Selenium 以及它的工作流程

在代码中,Selenium 的典型使用流程如下:

  1. 配置浏览器驱动:首先需要下载并配置与浏览器对应的驱动程序,如 ChromeDriver 对应 Chrome 浏览器。该驱动是 Selenium 控制浏览器的桥梁,必须版本匹配。

  2. 初始化 WebDriver:在代码中创建一个 WebDriver 实例来启动浏览器。例如,在 Python 中可以通过 webdriver.Chrome() 来启动 Chrome。

  3. 编写自动化操作:通过 WebDriver 提供的 API,编写各种模拟操作,如访问页面、查找元素、执行点击、输入文本等。例如,driver.find_element_by_id() 可以找到页面元素,driver.get("https://example.com") 用于访问网址。

  4. 关闭浏览器:任务完成后,调用 driver.quit() 来关闭浏览器并释放资源。

3. Chrome 和 Chrome Headless Shell 的选择

在使用 Selenium 进行网页自动化时,有两种配置方式:

  1. 完整 Chrome 浏览器(支持 GUI)

    • 适用有图形界面的系统(如 Windows 和 Mac)。
    • 通过 --headless 启动 Chrome 的无界面模式。
    • 优点:与系统 Chrome 保持一致,直接更新浏览器即可。
  2. Chrome Headless Shell(不依赖 GUI)

    • 适合无界面的服务器(如 Linux 环境中的 Ubuntu 无 GUI 版)。
    • 直接在命令行中安装和使用,不依赖任何图形界面。
    • 优点:更轻量,资源占用更低,适合容器环境(如 Docker)。

4. 使用 ChromeDriver 启动 Chrome 和 Chrome Headless Shell 的代码示例

1. 在有 GUI 系统上启动 Chrome 的无界面模式

配置完整 Chrome 浏览器,并通过 --headless 参数启动无界面模式:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options# 配置 Chrome 选项
chrome_options = Options()
// chrome_options.add_argument("--headless")  # 启用无界面模式
chrome_options.add_argument("--no-sandbox")  # 适用于 Linux 系统,防止运行 Chrome 时沙箱模式导致的问题
chrome_options.add_argument("--disable-gpu")  # 用于 Windows 系统,避免无界面模式下的 GPU 渲染问题
chrome_options.add_argument("--window-size=1920x1080")  # 指定浏览器窗口大小,模拟不同屏幕分辨率
chrome_options.add_argument("--disable-dev-shm-usage")  # 避免共享内存问题# 启动 ChromeDriver
service = Service("/usr/local/bin/chromedriver")  # 替换为 ChromeDriver 路径
driver = webdriver.Chrome(service=service, options=chrome_options)driver.get("https://example.com")
print("页面标题:", driver.title)
driver.quit()

2. 在无 GUI 系统上启动 Chrome Headless Shell

使用 Chrome Headless Shell 路径启动无界面浏览器:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Optionschrome_options = Options()
chrome_options.binary_location = "/path/to/chrome-headless-shell"  # 替换为 Chrome Headless Shell 路径
chrome_options.add_argument("--headless")  # 无界面模式
chrome_options.add_argument("--no-sandbox")  # Linux 推荐设置,防止运行 Chrome 时沙箱模式导致的问题
chrome_options.add_argument("--disable-dev-shm-usage")  # 避免共享内存问题service = Service("/usr/local/bin/chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)driver.get("https://example.com")
print("页面标题:", driver.title)
driver.quit()

三、Python 版本实现

环境安装

1. 安装 Python

确保已安装 Python,并使用 python --version 查看是否为兼容版本(推荐 3.8 及以上)。
可以使用nvm来进行python

2. 下载 ChromeDriver

根据 Chrome 浏览器的版本(本地已安装Chrome浏览器),下载对应版本的 ChromeDriver 并将其添加到系统路径中。

  • 使用chrome浏览器打开 Google Chrome Testing,会自动检测你本地安装的chrome浏览器版本,并为你推荐合适的ChromeDriver版本,因为我是Mac Intel系统,所以选择的是mac-x64的ChromeDriver
    在这里插入图片描述
  • 将下载的 chromedriver 文件解压缩,得到一个可执行文件 chromedriver
  • 将 chromedriver 文件复制到 /usr/local/bin,以便全局访问。可以使用以下命令:
sudo mv /path/to/chromedriver /usr/local/bin/
  • 验证 ChromeDriver 是否配置成功,运行以下命令:
chromedriver --version

如果成功配置,会显示 ChromeDriver 的版本信息。
在这里插入图片描述

3. 安装 Selenium

使用以下命令安装 Selenium:

pip install selenium

4. 测试 Selenium 是否正常运行

  • 编写一个简单的测试脚本打开浏览器,访问百度并检查是否能正确加载页面。
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--headless")  # 启用无界面模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")# 启动 ChromeDriver
service = Service("/usr/local/bin/chromedriver")  # 替换为 ChromeDriver 路径
driver = webdriver.Chrome(service=service, options=chrome_options)try:# 访问百度首页driver.get("https://www.baidu.com")time.sleep(1)  # 等待页面加载# 打印页面标题print("页面标题:", driver.title)# 在搜索框中输入关键词 "China" 并执行搜索search_box = driver.find_element(By.CSS_SELECTOR, "#kw")search_box.send_keys("China")search_button = driver.find_element(By.CSS_SELECTOR, "#su")search_button.click()time.sleep(2)  # 等待搜索结果加载# 打印搜索结果页面标题print("搜索结果页面标题:", driver.title)finally:# 关闭浏览器driver.quit()
  • 控制台输出成功:
    在这里插入图片描述

5. 使用python抓取 mercari.com 网站指定品类的商品信息

# -*- coding: utf-8 -*-from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--headless")  # 启用无界面模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")# 初始化浏览器
driver = webdriver.Chrome(options=chrome_options)# 打开网页
driver.get("https://jp.mercari.com/")# 找到搜索框并输入内容
search_box = driver.find_element(By.CSS_SELECTOR, "input[placeholder='なにをお探しですか?']")
search_box.send_keys("Adidas")# 等待加载并点击搜索按钮
search_button = driver.find_element(By.CSS_SELECTOR, "button[aria-label='検索']")
search_button.click()# 等待搜索结果加载
# 等待直到搜索结果的元素出现在页面中
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[data-testid='search-item-grid'] ul"))  # 根据实际情况修改选择器
)# 定义获取产品信息的函数
def get_product_info():# 获取页面源代码page_source = driver.page_source# 使用BeautifulSoup解析页面soup = BeautifulSoup(page_source, 'html.parser')# 获取商品信息products = soup.select('div[data-testid="search-item-grid"] ul > li[data-testid="item-cell"]')  # 选择 ul 下的 li 元素# results = driver.find_elements(By.CSS_SELECTOR, "div[data-testid='search-item-grid'] ul")product_info = []for product in products:name_elem = product.select_one('span[data-testid="thumbnail-item-name"]')price_elem = product.select_one('[class*="priceContainer"]')img_elem = product.select_one('img')# 检查元素是否存在并处理 Unicodename = name_elem.text.strip() if name_elem else u'未找到名称'price = price_elem.text.strip() if price_elem else u'未找到价格'img_url = img_elem['src'] if img_elem else u'未找到图片链接'product_info.append((name, price, img_url))return product_info# 向下滚动以加载更多商品
def scroll_and_load_more():last_height = driver.execute_script("return document.body.scrollHeight")while True:# 向下滚动到页面底部driver.execute_script("window.scrollBy(0, 300);")# 等待新的内容加载time.sleep(2)# 计算新的滚动高度并与上一次高度进行比较new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:break  # 如果没有新的内容加载,退出循环last_height = new_height# 调用向下滚动的函数
scroll_and_load_more()# 获取产品信息
products = get_product_info()# 打印结果
for name, price, img_url in products:print(u'名称: {}, 价格: {}, 图片链接: {}'.format(name, price, img_url))# 关闭浏览器
driver.quit()
  • 等待抓取成功后并输出抓取到的商品信息:
    在这里插入图片描述

四、PHP 版本实现

环境安装

1. 安装 PHP Selenium WebDriver 库

  • 使用 Composer 安装 WebDriver:
composer require facebook/webdriver
  • 使用文档
    具体的使用方法见 PHP Selenium WebDriver Github 仓库WIKI文档

2. 下载 ChromeDriver

根据 Chrome 浏览器版本,下载对应版本的 ChromeDriver 并将其添加到系统路径中。
(步骤同上面的Python版本中的ChromeDriver安装)

3. 安装 Java

  • PHP、Java 等语言没有直接支持 WebDriver API 的库,因此需要借助 Selenium Server 发送 WebDriver 请求。通过 Selenium Server,PHP 和 Java 客户端可以间接与 ChromeDriver 等浏览器驱动通信。
  • Python 中不需要单独启动 Selenium Server,是因为它可以直接使用浏览器驱动程序(如 ChromeDriver 或 GeckoDriver)与浏览器通信,而无需通过 Selenium Server 的中间层。这是因为 Python 的 Selenium 库内置支持 WebDriver API,可以直接控制浏览器驱动,免去额外的服务器进程。
  • 启动 Selenium Server 需要通过 Java 命令运行 JAR 文件。Selenium Server 是基于 Java 构建的,所以无论在什么操作系统上(包括 macOS),都需要安装 Java,并用 Java 命令来启动它。

  • 前往 Java官网 下载Java安装包,根据自己的操作系统选择合适的版本,这里我下载的是Mac OS 的 x64 DMG Installer :
    在这里插入图片描述

  • 下载后双击安装同意即可

  • 最后在控制台输入检查Java是否安装成功

java --version
  • 输出版本信息代表安装成功
    在这里插入图片描述

4. 下载 Selenium Server JAR 文件

  • Selenium Server 主要用于以下场景:

    • 分布式测试环境:在多台机器上进行测试,尤其是在集成和自动化测试场景中,Selenium Server 可以集中管理多台机器上的浏览器控制。
    • 非本地浏览器控制:例如,如果需要在远程服务器上控制浏览器,Selenium Server 作为一个中间层,可以通过 WebDriver 协议远程控制浏览器。
    • 多语言支持:Java、PHP 等客户端库通过 Selenium Server 来发送 WebDriver 请求,因为这些语言没有像 Python 一样的浏览器驱动的直接连接支持。
  • 前往Selenium官网下载最新版本的Selenium Server JAR 文件。

在这里插入图片描述

  • 下载后,将Selenium Server jar文件放置在一个便于管理的目录下,例如 ~/selenium/

5. 启动 Selenium 服务

  1. 通过以下命令启动 Selenium Server 服务:
cd ~/selenium-java/
java -jar selenium-server-4.26.0.jar standalone
  • 此时,Selenium Server 将在默认的 http://localhost:4444 端口启动。
  • 验证 Selenium Server 是否启动成功
    • 打开浏览器,访问 http://localhost:4444。如果页面显示了 Selenium Server 的信息,则说明启动成功。
      在这里插入图片描述
  1. 还有一种方式是不通过Selenium Server服务,直接启动chromedriver服务,比较适合本地的单机服务来运行抓取业务(可以不安装Java和Selenium Server)
chromedriver --port=4444
  1. Selenium Server 提供了几种不同的启动模式,每种模式适用于不同的分布式或本地测试需求。以下是常见模式的启动命令和适用场景:
  • Standalone 模式

    • 命令: java -jar selenium-server.jar standalone
    • 场景: 适用于单机环境,将所有组件(Session 管理、路由、分发)整合到一个服务中。适合无需分布式的简单测试。
  • Hub 模式

    • 命令: java -jar selenium-server.jar hub
    • 场景: 作为集群中心管理节点,用于接收测试请求并分配到各个 Node。适合需要分布式测试的场景。
  • Node 模式

    • 命令: java -jar selenium-server.jar node --detect-drivers true --hub
    • 场景: 作为测试执行节点注册到 Hub,实际执行测试任务。适用于分布式集群的场景。
  • SessionQueue 模式

    • 命令: java -jar selenium-server.jar sessionqueue
    • 场景: 单独管理请求队列,适合高并发场景。通常配合 Hub 使用,提高请求的调度效率。
  • Router 模式

    • 命令: java -jar selenium-server.jar router
    • 场景: 充当路由器,将请求分发至不同的 Hub。适合大型集群,提高请求分配效率。
  • Distributor 模式

    • 命令: java -jar selenium-server.jar distributor
    • 场景: 管理和分发 Session,适合复杂的分布式集群,通常和 Hub、Node 配合使用。

6. 测试服务是否正常运行

在 PHP 中编写一个简单脚本,测试能否正常启动 Selenium 并控制浏览器。

<?php// 引入 PHP WebDriver 的库
require_once('vendor/autoload.php');use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\WebDriverBy;try {// 配置 Chrome 选项$chromeOptions = new ChromeOptions();$chromeOptions->addArguments(['--headless', '--disable-gpu', '--no-sandbox']);$capabilities = DesiredCapabilities::chrome();$capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);// 启动 ChromeDriver,替换为 ChromeDriver 路径$driver = RemoteWebDriver::create("http://localhost:4444", $capabilities);// 访问百度首页$driver->get("https://www.baidu.com");sleep(1);  // 等待页面加载// 打印页面标题echo "页面标题: " . $driver->getTitle() . "\n";// 在搜索框中输入关键词 "China" 并执行搜索$searchBox = $driver->findElement(WebDriverBy::cssSelector("#kw"));$searchBox->sendKeys("China");$searchButton = $driver->findElement(WebDriverBy::cssSelector("#su"));$searchButton->click();sleep(2);  // 等待搜索结果加载// 打印搜索结果页面标题echo "搜索结果页面标题: " . $driver->getTitle() . "\n";$driver->quit();
} catch (Exception $e) {echo "Error: " . $e->getMessage() . "\n";// 关闭浏览器if (isset($driver)) {$driver->quit();}
}
  • 等待抓取成功后并输出抓取到的商品信息:
    在这里插入图片描述

以上就是完整的实现流程和代码示例。

相关文章:

爬虫 - 二手交易电商平台数据采集 (一)

背景: 近期有一个需求需要采集某电商网站平台的商品数据进行分析。因此&#xff0c;我计划先用Python实现一个简单的版本&#xff0c;以快速测试技术的实现可能性&#xff0c;再用PHP实现一个更完整的版本。文章中涉及的技术仅为学习和测试用途&#xff0c;请勿用于商业或非法用…...

“成交量分布指标“,通过筹码精准锁定价格方向+简单找市场支撑压力位 MT4免费公式!

指标名称&#xff1a;成交量分布指标 版本&#xff1a;MT4 ver. 1.32 之前发布的市场分布图不少朋友反馈不错&#xff0c;希望获得其它版本。 这个版本只有MT4的&#xff0c;MT5可以看之前版本&#xff0c;链接&#xff1a; “市场分布图”&#xff0c;精准把握价格动向 更直…...

简记Vue3(四)—— 路由

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

Python批量合并多个PDF

在日常工作中&#xff0c;处理和合并多个 PDF 文件是一个常见需求&#xff0c;尤其是在需要将大量文件整理成一个完整文档时。本文将详细介绍如何使用 Python 的 PyMuPDF 库来实现批量 PDF 文件合并&#xff0c;并提供针对大文件优化的解决方案。 安装 PyMuPDF 要使用 PyMuPD…...

Linux:vim命令总结及环境配置

文章目录 前言一、vim的基本概念二、vim模式命令解析1. 命令模式1&#xff09;命令模式到其他模式的转换&#xff1a;2&#xff09;光标定位&#xff1a;3&#xff09;其他命令&#xff1a; 2. 插入模式3. 底行模式4. 替换模式5. 视图模式6. 外部命令 三、vim环境的配置1. 环境…...

贪心算法day05(k次取反后最大数组和 田径赛马)

目录 1.k次取反后最大化的数组和 2.按身高排序 3.优势洗牌 1.k次取反后最大化的数组和 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代码&#xff1a; class Solution {public int largestSumAfterKNegations(int[] nums, int k) {//如…...

默认 iOS 设置使已锁定的 iPhone 容易受到攻击

苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的&#xff0c;但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…...

上海市计算机学会竞赛平台2024年11月月赛丙组

题目描述 在一个棋盘上&#xff0c;有两颗棋子&#xff0c;一颗棋子在第 aa 行第 bb 列&#xff0c;另一个颗棋子在第 xx 行第 yy 列。 每一步&#xff0c;可以选择一个棋子沿行方向移动一个单位&#xff0c;或沿列方向移动一个单位&#xff0c;或同时沿行方向及列方向各移动…...

Python批量设置图片背景为透明

我们日常生活中制作PPT等教学资源时&#xff0c;需要批量去除图片背景&#xff0c;就可以使用 Python 的 rembg 库。 这个库基于神经网络模型&#xff0c;去背景效果较好&#xff0c;可以批量处理png, jpg, jpeg等图片。采用以下代码可以批量处理当前目录下的所有图片&#xf…...

Vue CLI 脚手架

cli脚手架创建项目步骤 全局安装(一次)&#xff1a;yarn global add vue/cli 无法识别yarn的要先安装yarn&#xff1b;终端执行npm install -g yarn 查看Vue版本&#xff1a;vue --version 这里有问题&#xff08;success上方有warning) 报错&#xff1a;‘vue’不是内部或外部…...

Linux【基础篇】

-- 原生罪 linux的入门安装学习 什么是操作系统&#xff1f; 用户通过操作系统和计算机硬件联系使用。桥梁~ 什么是Linux&#xff1f; 他是一套开放源代码&#xff08;在互联网上找到Linux系统的源代码&#xff0c;C语言写出的软件&#xff09;&#xff0c;可以自由 传播&…...

多线程环境下安全地使用 SimpleDateFormat的常见方法

文章目录 1. 使用局部变量&#xff08;每个线程独立一个实例&#xff09;2. 使用 ThreadLocal<SimpleDateFormat>3. 使用 DateTimeFormatter&#xff08;Java 8 及以上&#xff09;4. 使用 DateFormat 子类&#xff08;如 FastDateFormat&#xff09;5. 使用 synchronize…...

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…...

ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过&#xff0c;是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态&#xff0c;与静态的数据集&#xff08;比如说我自己的工作&#xff09;不同&#xff0c;因此…...

Docker 常用命令详解(详细版)

Docker 是一个开源的容器化平台&#xff0c;它使得开发人员可以打包应用程序及其所有依赖项&#xff0c;并在任何环境中运行。Docker 提供了简单而强大的命令行工具来管理容器、镜像、网络等。本文将详细介绍 Docker 的常用命令及其使用方法。 1. 安装 Docker 在使用 Docker …...

【网络安全 | 甲方安全建设】分布式系统、Redis分布式锁及Redisson看门狗机制

未经许可,不得转载。 文章目录 分布式系统分布式系统的核心特性分布式系统的典型架构分布式锁概念Redis 分布式锁原理互斥性锁释放锁的唯一性具体实现Redisson分布式锁分布式系统 分布式系统是一种由多台计算机(节点)组成的系统,这些节点通过网络相互连接并协同工作,共同…...

「QT」几何数据类 之 QLineF 浮点型直线类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

Treeland 技术揭秘,如何使得 DDE 纵享丝滑?

近日&#xff0c;deepin&#xff08;深度&#xff09;社区亮相COSCon24 第九届中国开源年会开源市集&#xff0c;且社区资深桌面研发工程师张丁元为大家来了《Treeland&#xff0c;DDE进步的阶梯》技术分享。 就着这个机会&#xff0c;今天就让我们一起来聊聊如何在追求华丽动…...

快速了解SpringBoot 统一功能处理

拦截器 什么是拦截器&#xff1a; 拦截器是Spring框架提供的重要功能之一&#xff0c;主要进行拦截用户请求&#xff0c;在指定方法前后&#xff0c;根据业务需求&#xff0c;执行预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以…...

C++区分数组的引用和引用的数组

void f(int (&arr)[10]) {//正确} void f1(int &arr[10]) {//不允许使用引用的数组} []&#xff08;数组下标运算符&#xff09;的优先级高于&&#xff08;取地址运算符&#xff09;。所有表达式&arr[i]等价于&(arr[i]) 引用的数组 一个包含引用的数组&…...

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…...

ESLint 使用教程(五):ESLint 和 Prettier 的结合使用与冲突解决

前言 在现代前端开发中&#xff0c;代码质量与代码风格的统一是两个非常重要的方面。良好的代码质量能减少 bug 的产生&#xff0c;而统一的代码风格则能提高团队协作的效率。为了实现这两个目标&#xff0c;我们通常会使用一些工具。 为了保证代码的可读性和维护性&#xff0…...

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…...

【C语言】。末尼

用js写一个冒泡排序 当然可以。在JavaScript中&#xff0c;你可以使用递归的方式来实现冒泡排序算法。这是一个简单的示例&#xff1a; function bubbleSort(arr) { let len arr.length; if(len < 1){ return arr; // 如果数组只有一个元素或为空&#xf…...

【鉴权】深入解析 Token:身份认证的核心技术

目录 引言一、Token 的定义与概念1.1 Token 是什么&#xff1f;1.2 无状态性与自包含性1.3 Token 的工作流程1.3.1 基本工作流程1.3.2 工作流程图示 二、Token 的常见用途2.1 用户身份验证2.2 授权控制2.3 防止跨站请求伪造&#xff08;CSRF&#xff09;2.4 跨域认证 三、Token…...

FastReport将停止 .NET Framework 上的 WebReport 更新

从2024/ 12 /1 日起&#xff0c;Fastreport将停止发布更新和提供对 FastReport.Web (.NET Framework) 的技术支持。该库一直是使用 Online Designer 的许多项目中报告的核心。这些更改意味着 FastReport.Web (Legacy) 库&#xff08;FastReport.Net包的一部分&#xff09;将不再…...

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况&#xff08;拓展&#xff09;1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…...

在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码

在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码 在Ubuntu下安装RabbitMQ可以按照以下步骤进行&#xff1a;步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 更新APT索引并安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: …...

HTTPS通信和TCP通信有什么不一样

HTTPS通信和TCP通信的主要区别如下&#xff1a; ‌协议层次‌&#xff1a;HTTPS是应用层协议&#xff0c;建立在HTTP协议之上&#xff0c;并增加了SSL/TLS加密层&#xff1b;而TCP是传输层协议&#xff0c;提供可靠的数据传输服务。‌安全性‌&#xff1a;HTTPS通过SSL/TLS加密…...

Kafka 的一些问题,夺命15连问

kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题&#xff08;topics&#xff09;。 消费者API 允许应用程序订阅一个或者多个主题&#xff0c;并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器&#xff08;s…...

梅州市工程建设交易中心网站/网站策划运营

打开背包,打开商店,里面的东西琳琅满目,怎么实现呢?直接通过UI加载?是不是太消耗内存啦,此时我们就读表加载 商品表 Item表 从上面shop表中读取序列号,在Item表中进行查找加载 c#读表的名字要与表的名字一致哟(其实也完全不一样,人家前面多个Dr嘛,哈哈) 是不是在哪见过?对,就…...

wordpress分享代码/短视频运营

Oracle的NO_DATA_FOUND和%NOTFOUND两个保留字的用法不够了解&#xff0c;主要是它们从意义上是有些类似。其实它们的用法是有区别的&#xff0c;小结如下&#xff1a;SELECT . . . INTO 语句触发 NO_DATA_FOUND&#xff1b;当一个显示光标的 where 子句未找到时 触发 %NOTFOUND…...

使用ftp修改网站图片/seo服务商技术好的公司

2008年&#xff0c;苹果发布AppStore&#xff0c;Google发布Android 1.0&#xff0c;自此开发者群体里有一群人开始涉足移动互联网&#xff0c;我们开始做App了。随着智能手机和移动网络的普及&#xff0c;越来越多的产品服务实现无线化。在南天&#xff08;介绍&#xff09;QC…...

建好了网站怎么做外贸/北京官网seo收费

Hadoop界的Hello World! 2019-05-20 19:50:09 应用平台&#xff1a;Eclipseubantuhadoop包 注&#xff1a;例分析的形式给宝宝们解释一下&#xff0c;详细运行过程省略。 实例&#xff1a;定义一个进行统计的原始文件 Hello MrZhangxd Hello Yootk Hello Bye Bye Bye Hello Mr…...

做公司网站要注意哪些问题/如何做好一个品牌推广

一、为什么不用github而使用码云&#xff1f; 私有——免费&#xff0c;速度快 二、怎么用&#xff1f; 1.下载安装好git. 2.去码云官网注册个账号。官网&#xff1a;https://git.oschina.net/ 3.创建项目。项目创建好后&#xff0c;你会发现&#xff0c;可以直接通过上传文件…...

上百度推广 免费做网站/推广公司

第七步&#xff1a;修改oozie-site.xml cd /export/servers/oozie-4.1.0-cdh5.14.0/conf vim oozie-site.xml 如果没有这些属性&#xff0c;直接添加进去即可&#xff0c;oozie默认使用的是UTC的时区&#xff0c;我们需要在我们oozie-site.xml当中记得要配置我们的时区为GMT080…...