Python爬取京东商品信息,详细讲解,手把手教学(附源码)
Python 爬虫爬取京东商品信息
下面我将逐一解释每一部分的代码
导入库
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import time
import random
import csv
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import os
import requests
from datetime import datetime
import re
-
作用:导入所有必要的库和模块。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
time
,random
: 用于添加延迟和生成随机数。 -
csv
: 用于读写CSV文件。 -
os
: 用于文件系统操作。 -
requests
: 用于发送HTTP请求(例如下载图片)。 -
datetime
: 用于处理日期和时间。 -
re
: 用于正则表达式匹配。
配置变量
KEYWORD = '美妆'
CSV_FILE = 'DepartmentStore.csv'
id = 3538
dratenums = 5
drate = 5
num = 5
-
作用:初始化全局变量。
-
技术栈:无特殊技术栈。
设置WebDriver
# 创建EdgeOptions对象
options = Options()# 设置Edge WebDriver的路径
webdriver_path = 'G:\\大三下暑期实训基于电商商品推荐平台\\爬虫\\a\\msedgedriver.exe'
service = Service(webdriver_path)# 初始化Edge WebDriver
driver = webdriver.Edge(service=service, options=options)# 窗口最大化
driver.maximize_window()wait = WebDriverWait(driver, 15)
-
作用:初始化Microsoft Edge WebDriver。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。
函数定义
search_goods
函数
def search_goods(start_page, total_pages):
-
作用:搜索特定商品并处理翻页逻辑。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
pyquery
: 用于解析HTML文档。 -
time
: 用于添加延迟。 -
random
: 用于生成随机数。
page_turning
函数
def page_turning(page_number):# ...
-
作用:实现翻页操作。
-
技术栈:
selenium
: 用于自动化浏览器操作。
random_sleep
函数
def random_sleep(timeS, timeE):# ...
-
作用:随机等待一段时间,防止被网站检测到爬虫行为。
-
技术栈:
time
,random
: 用于添加延迟和生成随机数。
scroll_smoothly
函数
def scroll_smoothly(duration):# ...
-
作用:平滑滚动页面以模拟真实用户行为。
-
技术栈:
selenium
: 用于自动化浏览器操作。
get_goods
函数
def get_goods():# ...
-
作用:获取商品列表中的具体信息。
-
技术栈:
-
selenium
: 用于自动化浏览器操作。 -
pyquery
: 用于解析HTML文档。 -
os
: 用于文件系统操作。 -
requests
: 用于发送HTTP请求(例如下载图片)。 -
datetime
: 用于处理日期和时间。 -
re
: 用于正则表达式匹配。
save_to_csv
函数
def save_to_csv(result):# ...
-
作用:将获取到的商品信息保存到CSV文件中。
-
技术栈:
csv
: 用于读写CSV文件。
main
函数
def main():# ...
-
作用:主函数,用于启动爬虫并处理异常。
-
技术栈:无特殊技术栈。
主程序入口
if __name__ == '__main__':main()
-
作用:程序的入口点。
-
技术栈:无特殊技术栈。
接下来,我将针对每个函数进行详细的代码解释。
search_goods
函数
def search_goods(start_page, total_pages):print('正在搜索: ')try:driver.get('https://www.taobao.com')time.sleep(10)driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))input.send_keys(KEYWORD)submit.click()time.sleep(10)if start_page != 1:driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")random_sleep(1, 3)pageInput = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/span[3]/input')))pageInput.send_keys(start_page)admit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[3]')))admit.click()get_goods()for i in range(start_page + 1, start_page + total_pages):page_turning(i)except TimeoutException:print("search_goods: error")return search_goods(start_page, total_pages)
-
作用:搜索特定商品并处理翻页逻辑。
-
细节:
-
打开淘宝网站并等待页面加载。
-
使用CDP命令禁用WebDriver标志,以防被网站检测。
-
在搜索框中输入关键词并提交。
-
如果不是第一页,则跳转到指定的起始页。
-
调用
get_goods
函数获取商品信息。 -
循环翻页并获取商品信息。
page_turning
函数
def page_turning(page_number):print('正在翻页: ', page_number)try:submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]')))submit.click()wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/span/em'), str(page_number)))get_goods()except TimeoutException:page_turning(page_number)
-
作用:实现翻页操作。
-
细节:
-
点击下一页按钮。
-
等待新的页面加载完成。
-
调用
get_goods
函数获取商品信息。
random_sleep
函数
def random_sleep(timeS, timeE):random_sleep_time = random.uniform(timeS, timeE)time.sleep(random_sleep_time)
-
作用:随机等待一段时间,防止被网站检测到爬虫行为。
-
细节:
-
生成一个在
timeS
到timeE
之间的随机数作为睡眠时间。 -
使用
time.sleep
暂停指定的时间。
scroll_smoothly
函数
def scroll_smoothly(duration):total_height = driver.execute_script("return document.body.scrollHeight")viewport_height = driver.execute_script("return window.innerHeight")steps = 30 # 分成30步step_duration = duration / steps # 每步的时间step_height = (total_height - viewport_height) / steps # 每步的高度for i in range(steps):driver.execute_script(f"window.scrollBy(0, {step_height});")time.sleep(step_duration)
-
作用:平滑滚动页面以模拟真实用户行为。
-
细节:
-
计算页面的总高度和视窗的高度。
-
计算每次滚动的距离和时间。
-
使用JavaScript执行平滑滚动效果。
get_goods
函数
def get_goods():global id, drate, dratenums, num # 声明使用全局变量 idrandom_sleep(2, 4)# 滑动浏览器滚轮,向下滑动scroll_smoothly(4)random_sleep(4, 4) # 等待页面加载html = driver.page_sourcedoc = pq(html)items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()for item in items:title = item.find('.Title--title--jCOPvpf span').text()price_int = item.find('.Price--priceInt--ZlsSi_M').text()price_float = item.find('.Price--priceFloat--h2RR0RK').text()if price_int and price_float:price = float(f"{price_int}{price_float}")else:price = 0.0deal = item.find('.Price--realSales--FhTZc7U').text()location = item.find('.Price--procity--_7Vt3mX').text()shop = item.find('.ShopInfo--TextAndPic--yH0AZfx a').text()postText = item.find('.SalesPoint--subIconWrapper--s6vanNY span').text()result = 1 if "包邮" in postText else 0image = item.find('.MainPic--mainPicWrapper--iv9Yv90 img').attr('src')# 图片的URLimage_url = imagepattern = r"https:\/\/.*?\.jpg"match = re.search(pattern, image_url)if match:print("Extracted URL:", match.group(0))else:print("No match found")image_url = match.group(0)# 保存图片的文件夹save_folder = "shopping_cover"# 确保保存路径存在if not os.path.exists(save_folder):os.makedirs(save_folder)# 将图片文件名固定为 '1.jpg'image_name = str(id) + ".jpg"# 完整的保存路径save_path = os.path.join(save_folder, image_name)# 获取当前日期current_date = datetime.now()# 格式化日期为 'yyyy-mm-dd'formatted_date = current_date.strftime('%Y-%m-%d')imdblink = item.find('.Card--doubleCardWrapper--L2XFE73 a').attr('href')# 下载图片并保存try:with requests.get(image_url, stream=True) as response:response.raise_for_status()with open(save_path, 'wb') as f:for chunk in response.iter_content(chunk_size=8192):if chunk: # filter out keep-alive new chunksf.write(chunk)print(f"图片已保存到: {save_path}")product = {'id': id,'name': title,'director': shop,'country': location,'years': formatted_date,'leader': price,'d_rate_nums': dratenums,'d_rate': drate,'intro': deal + str(result),'num': num,'orign_image_link': image,'image_link': save_folder + '/' + image_name,'imdb_link': imdblink}save_to_csv(product)id += 1except requests.RequestException as e:print(f"下载图片失败:{e}")# 直接滑动浏览器滚轮到最顶部driver.execute_script("window.scrollTo(0, 0);")
-
作用:获取商品列表中的具体信息。
-
细节:
-
使用
pyquery
解析HTML源码。 -
提取每个商品的信息。
-
下载并保存商品图片。
-
调用
save_to_csv
保存数据。
save_to_csv
函数
def save_to_csv(result):try:with open(CSV_FILE, mode='a', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow([result['id'], result['name'], result['director'], result['country'], result['years'], result['leader'], result['d_rate_nums'], result['d_rate'], result['intro'], result['num'], result['orign_image_link'], result['image_link'], result['imdb_link']])print('存储到CSV成功: ', result)except Exception as e:print('存储到CSV出错: ', result, e)
-
作用:将获取到的商品信息保存到CSV文件中。
-
细节:
-
将商品信息追加到CSV文件中。
-
输出保存成功的消息或错误消息。
main
函数
def main():try:# 检查文件是否存在,如果不存在则创建并写入标题行if not os.path.exists(CSV_FILE):with open(CSV_FILE, mode='w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow(['id', 'name', 'director', 'country', 'years', 'leader', 'd_rate_nums', 'd_rate', 'intro', 'num', 'orign_image_link', 'image_link', 'imdb_link'])pageStart = int(input("输入您想开始爬取的页面数: "))pageAll = int(input("输入您想爬取的总页面数: "))search_goods(pageStart, pageAll)except Exception as e:print('main函数报错: ', e)
-
作用:主函数,用于启动爬虫并处理异常。
-
细节:
-
检查CSV文件是否存在,若不存在则创建并写入表头。
-
获取用户输入的起始页和总页数。
-
调用
search_goods
函数开始爬取。
主程序入口
if __name__ == '__main__':main()
-
作用:程序的入口点。
-
细节:当直接运行此文件时,执行
main
函数。
以下是完整代码
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import time
import random
import csv
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import os
import requests
from datetime import datetime
import reKEYWORD = '美妆'
CSV_FILE = 'DepartmentStore.csv'
id = 3538
dratenums = 5
drate = 5
num = 5# 创建EdgeOptions对象
options = Options()# 设置Edge WebDriver的路径
webdriver_path = 'G:\\大三下暑期实训基于电商商品推荐平台\\爬虫\\a\\msedgedriver.exe'
service = Service(webdriver_path)# 初始化Edge WebDriver
driver = webdriver.Edge(service=service, options=options)# 窗口最大化
driver.maximize_window()wait = WebDriverWait(driver, 15)def search_goods(start_page, total_pages):print('正在搜索: ')try:driver.get('https://www.taobao.com')time.sleep(10)driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))input.send_keys(KEYWORD)submit.click()time.sleep(10)if start_page != 1:driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")random_sleep(1, 3)pageInput = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/span[3]/input')))pageInput.send_keys(start_page)admit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[3]')))admit.click()get_goods()for i in range(start_page + 1, start_page + total_pages):page_turning(i)except TimeoutException:print("search_goods: error")return search_goods(start_page, total_pages)def page_turning(page_number):print('正在翻页: ', page_number)try:submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]')))submit.click()wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/span/em'), str(page_number)))get_goods()except TimeoutException:page_turning(page_number)def random_sleep(timeS, timeE):random_sleep_time = random.uniform(timeS, timeE)time.sleep(random_sleep_time)def scroll_smoothly(duration):total_height = driver.execute_script("return document.body.scrollHeight")viewport_height = driver.execute_script("return window.innerHeight")steps = 30 # 分成30步step_duration = duration / steps # 每步的时间step_height = (total_height - viewport_height) / steps # 每步的高度for i in range(steps):driver.execute_script(f"window.scrollBy(0, {step_height});")time.sleep(step_duration)def get_goods():global id, drate, dratenums, num # 声明使用全局变量 idrandom_sleep(2, 4)# 滑动浏览器滚轮,向下滑动scroll_smoothly(4)random_sleep(4, 4) # 等待页面加载html = driver.page_sourcedoc = pq(html)items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()for item in items:title = item.find('.Title--title--jCOPvpf span').text()price_int = item.find('.Price--priceInt--ZlsSi_M').text()price_float = item.find('.Price--priceFloat--h2RR0RK').text()if price_int and price_float:price = float(f"{price_int}{price_float}")else:price = 0.0deal = item.find('.Price--realSales--FhTZc7U').text()location = item.find('.Price--procity--_7Vt3mX').text()shop = item.find('.ShopInfo--TextAndPic--yH0AZfx a').text()postText = item.find('.SalesPoint--subIconWrapper--s6vanNY span').text()result = 1 if "包邮" in postText else 0image = item.find('.MainPic--mainPicWrapper--iv9Yv90 img').attr('src')# 图片的URLimage_url = imagepattern = r"https:\/\/.*?\.jpg"match = re.search(pattern, image_url)if match:print("Extracted URL:", match.group(0))else:print("No match found")image_url = match.group(0)# 保存图片的文件夹save_folder = "shopping_cover"# 确保保存路径存在if not os.path.exists(save_folder):os.makedirs(save_folder)# 将图片文件名固定为 '1.jpg'image_name = str(id) + ".jpg"# 完整的保存路径save_path = os.path.join(save_folder, image_name)# 获取当前日期current_date = datetime.now()# 格式化日期为 'yyyy-mm-dd'formatted_date = current_date.strftime('%Y-%m-%d')imdblink = item.find('.Card--doubleCardWrapper--L2XFE73 a').attr('href')# 下载图片并保存try:with requests.get(image_url, stream=True) as response:response.raise_for_status()with open(save_path, 'wb') as f:for chunk in response.iter_content(chunk_size=8192):if chunk: # filter out keep-alive new chunksf.write(chunk)print(f"图片已保存到: {save_path}")product = {'id': id,'name': title,'director': shop,'country': location,'years': formatted_date,'leader': price,'d_rate_nums': dratenums,'d_rate': drate,'intro': deal + str(result),'num': num,'orign_image_link': image,'image_link': save_folder + '/' + image_name,'imdb_link': imdblink}save_to_csv(product)id += 1except requests.RequestException as e:print(f"下载图片失败:{e}")# 直接滑动浏览器滚轮到最顶部driver.execute_script("window.scrollTo(0, 0);")def save_to_csv(result):try:with open(CSV_FILE, mode='a', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow([result['id'], result['name'], result['director'], result['country'], result['years'], result['leader'], result['d_rate_nums'], result['d_rate'], result['intro'], result['num'], result['orign_image_link'], result['image_link'], result['imdb_link']])print('存储到CSV成功: ', result)except Exception as e:print('存储到CSV出错: ', result, e)def main():try:# 检查文件是否存在,如果不存在则创建并写入标题行if not os.path.exists(CSV_FILE):with open(CSV_FILE, mode='w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow(['id', 'name', 'director', 'country', 'years', 'leader', 'd_rate_nums', 'd_rate', 'intro', 'num', 'orign_image_link', 'image_link', 'imdb_link'])pageStart = int(input("输入您想开始爬取的页面数: "))pageAll = int(input("输入您想爬取的总页面数: "))search_goods(pageStart, pageAll)except Exception as e:print('main函数报错: ', e)if __name__ == '__main__':main()
这份完整版的代码已经上传至CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费获取【保证100%免费】。
原创: 慕仙少白
相关文章:

Python爬取京东商品信息,详细讲解,手把手教学(附源码)
Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.c…...

大家有没有了解过TLKS-PLGS这款接地电阻在线监测装置?它在电力系统中能发挥什么作用呢?
接地电阻在线监测仪(输电铁塔接地电阻监测装置、变电站接地电阻监测装置、三极法接地网电阻监测装置)在电力系统中发挥着至关重要的作用,具体来说,有以下几个方面: 一、实时监测预警。该装置采用激励脉冲技术…...

Shell中的函数
目录 一、系统函数 (一)前言 (二)常用的函数 basename [string/pathname] [suffix] 二、自定义函数 (一)语法 (二)脚本例子 三、函数实际案例 过程中的报错: …...

通过IP地址或者主机名添加打印机20241023
文印室打印机连接方式20241023 Win键盘搜索打印机和扫描仪点击添加打印机或扫描仪,等候片刻点击“我需要的打印机不在列表中”添加打印机,选择使用IP地址或主机名添加打印机点击下一步,设备类型选择自动检测输入主机名:即打印机有…...

基于SpringBoot+Vue智慧养老关爱系统【提供源码+答辩PPT+参考文档+项目部署】
💥 这两年毕业设计和毕业答辩的要求和难度不断提升,传统的JavaWeb项目缺少创新和亮点,往往达不到毕业答辩的要求! ❗如何解决这类问题? 让我们能够顺利通过毕业,我也一直在不断思考、努力、精进。通过2024年…...

新手教学系列——利用短效代理快速搭建代理池
引言 在进行高并发数据抓取时,很多人都会遇到频繁IP被封的问题。要解决这个问题,代理池的搭建就成了关键。通过频繁更换代理IP,我们可以绕过网站的反爬机制,提升抓取效率。然而,很多初学者可能会觉得构建一个健壮的代理池颇为复杂,尤其是需要快速切换的短效代理池。在这…...
实体与DTO如何转换
下面是一些常用的转换库: Dozer 该项目目前不活跃,并且很可能在未来被弃用。 ModelMapper 一个智能对象映射库,可自动将对象相互映射。它采用基于约定的方法,同时提供简单、重构安全的应用程序接口(API)来…...

Docker 安装Postgres和PostGIS,并制作镜像
1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站:https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成,docker images 查看如…...

ES6:let和const命令解读以及变量的解构赋值
有时候,我们需要的不是答案,而是一双倾听的耳朵 文章目录 let和const命令变量的解构赋值 let和const命令 let和const命令都是声明变量的关键字,类同varlet特点 用来声明变量,不能再次定义,但是值可以改变存在块级作用…...
java-collection集合整理0.9.4
java-集合整理0.9.0 基本结构基本概念实例化举例遍历获取指定值 2024年10月17日09:43:16–0.9.0 2024年10月18日11:00:59—0.9.4 基本结构 Collection 是最顶级的接口。分为 List 和 Set 两大类。List 分为:ArrayList、LinkedList、Vector。Set 分为:Ha…...

ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误
让工作生活更高效:Parallels Desktop 20最新版本虚拟机的神奇之处 大家好!👋 今天我要跟大家安利一款让我工作效率飞升的神器——Parallels Desktop 20最新版本虚拟机。作为一个日常需要在不同操作系统间来回穿梭的人,这款软件简直…...
现代C语言:C23标准重大更新
虽然没有固定标准,但一般将C99之后的C语言标准称为“现代C语言”,目前的最新标准为C23。C语言的演化包括标准C89、C90、C99、C11、C17和C23,C23是C语言标准的一次重大修订,截至2024年3月,最新版本的gcc和 clang实现了C…...

Maven进阶——坐标、依赖、仓库
目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…...
Android中的内存泄漏及其检测方式
Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中,内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中,由于某些原因,已经不再使用的对象仍然被引用,导致垃圾回收器(Garbage Col…...
【雷电模拟器命令合集操作大全】官方文档整理贴
此贴是官方的帮助整理文档在这里插入代码片 一起来看看几个主要命令,大部分命令读者可以自己试试~ 1、launch 支持2种启动雷电模拟器的方式 –name顾名思义,应该是模拟器的标题栏的名字,本人经过验证果然如此! –index mnq_idx,模…...

redis的配置文件解析
我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件: 1.Redis的配置文件名称是:redis.conf 2.在vim这个配置文件的时候,默认是不显示行号的,可以编辑下面这个文件,末尾加上set nu,就会显示行号: 1.…...
Python中的元组和列表
Python 列表 Python有6个序列的内置类型,但最常见的是列表和元组。 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号…...

【AI战略思考7】粮草筹集完毕和我的朋友分类
注明:这是我昨晚12点多发布在朋友圈的,更新加工后的版本 粮草筹集完毕 统计完成 昨晚从7点半到晚上11点,借款的意向统计完成了,刚好凑够6个月😄,我觉得应该够了,我乐观估计是3个月内找到工作&…...

科大讯飞AI开发者大赛颁奖典礼,万码优才荣获前三甲!
在近日揭晓的科大讯飞AI开发者大赛中,万码优才APP凭借其卓越的技术实力、创新的应用方案以及深厚的行业洞察力,在上百个参赛队伍中脱颖而出,在AI Agent助力行业应用升级赛道荣获三甲排名!再次证明了其在人工智能领域的领先地位与无…...

Redis 哨兵机制
哨兵机制 哨兵机制的介绍 哨兵 (Sentinel) 先来看一下Redis Sentinel 相关名词解释: 在之前的主从复制中,存在一个问题,那就是当主节点挂了后,通过人工干预的方式来解决是比较繁琐且不那么靠谱的。 在实际开发中,对…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...