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

四、数据存储

在爬虫项目中,我们需要将目标站点数据进行持久化保存,一般数据保存的方式有两种:

  • 文件保存
  • 数据库保存

在数据保存的过程中需要对数据完成去重操作,所有需要使用 redis 中的 set 数据类型完成去重。

1.CSV文件存储

1.1 什么是csv

通俗直白的说:就是一个普通文件,里面的内容是每一行中的数据用逗号分隔,然后文件后缀为 csv。

1.2 python 对 csv 文件进行读写操作

写入列表数据到 csv 文件
import csvheaders=['班级','姓名','性别','手机号','qq']rows= [["21级Python", '小王', '男', '13146060xx1', '123456xx1'],["23级Python", '小李', '男', '13146060xx2', '123456xx2'],["24级Python", '小赵', '女', '13146060xx3', '123456xx3'],["25级Python", '小红', '女', '13146060xx4', '123456xx4'],
]with open('test.csv','w')as f:# 创建一个csv的writer对象,这样才能够将写入csv格式数据到这个文件f_csv=csv.writer(f)# 写入一行(我们用第一行当做表头)f_csv.writerow(headers)# 写入多行(当做数据)f_csv.writerows(rows)
写入字典数据到 csv 文件
import csvrows = [{"class_name": "21级Python","name": '小王',"gender": '男',"phone": '13146060xx1',"qq": '123456xx1'},{"class_name": "23级Python","name": '小李',"gender": '男',"phone": '13146060xx2',"qq": '123456xx2'},{"class_name": "25级Python","name": '小赵',"gender": '女',"phone": '13146060xx3',"qq": '123456xx3'},{"class_name": "25级Python","name": '小红',"gender": '女',"phone": '13146060xx4',"qq": '123456xx4'},
]with open('test2.csv','w')as f:# 创建一个csv的DictWriter对象,这样才能够写入csv格式数据到这个文件f_csv=csv.DicWriter(f,['class_name','name','gender','phone','qq'])# 写入一行(我们用第一行当做表头)f_csv.writeheader()# 写入多行(当做数据)f_csv.writerows(rows)
读取 csv 文件
import csvwith open('test.csv')as f:# 创建一个reader对象,迭代时能够提取到每一行(包括表头)f_csv=csv.reader(f)for row in f_csv:print(type(row),row)
读取 csv 文件内容并封装为字典
import csvwith open('test1.csv') as f:# 创建一个reader对象,迭代时能够提取到每一行(包括表头)f_csv=csv.DictReader(f)for row in f_csv:# print(type(row),row)print(row.get('class_name'),row.get('name'),row.get('phone'),row.get('qq')

1.3 b站数据采集

目标网站地址:https://search.bilibili.com/video?keyword=篮球&from_source=webtop_search&spm_id_from=333.1007&search_source=5

import csvimport requestsclass SaveVideoInfo():def __init__(self):self.url='https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page={}&page_size=42&pubtime_begin_s=0&pubtime_end_s=0&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=%E7%AF%AE%E7%90%83&qv_id=UqmKhHZFJGpXJFFFysVbJhBLO4zYWxY2&source_tag=3&gaia_vtoken=&dynamic_offset=0&web_location=1430654&w_rid=c58c1bee2f07bcb5250d3833e77c22fc&wts=1740882524'self.headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",'Cookie':"header_theme_version=CLOSE; DedeUserID=1298980584; DedeUserID__ckMd5=5e3b2340397bdf6e; enable_web_push=DISABLE; buvid3=E09C3995-A4E5-1427-8C75-E1AB8023027295670infoc; rpdid=|(k)~YuRY)RR0J'u~u|YYumYu; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; fingerprint=c6a73c0f0dda55fe0746058e948b8654; buvid_fp_plain=undefined; buvid_fp=c6a73c0f0dda55fe0746058e948b8654; hit-dyn-v2=1; home_feed_column=4; buvid4=D4D31387-5D1E-A689-10B9-E17B2599A15351637-024090611-3XXTIiL+zW/2j4Tgy4In/g%3D%3D; enable_feed_channel=DISABLE; b_nut=100; _uuid=A779410D4-3F32-5B8C-872D-22A37674D73C07883infoc; browser_resolution=1280-632; CURRENT_QUALITY=80; bp_t_offset_1298980584=1036726571777392640; b_lsid=7F947BD3_19554A85E19; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDExNDEyNzUsImlhdCI6MTc0MDg4MjAxNSwicGx0IjotMX0.aIhl_FfT5aPDRq54w2lQD8qA76uyoqdCY6LRlo-xS5M; bili_ticket_expires=1741141215; SESSDATA=d3ec22cb%2C1756434076%2C4b232%2A32CjC1HLgvdM4y8bKAGeIfrMY5cm4LWa-65-GDqQyHmQVBvADeCGns4u2YfIICt5-J9ckSVnVOdXBWQU9xZi1NUFBLNHNkMGk2WExrQk5aYXp6bXNNVWlFNTZIdUM1UjB2M3oyNXE4NzZFMEVSTWpJSm84QXZBekp0RG4tQi1BX3I3MGZmX2tLOUdRIIEC; bili_jct=8c27e9ac7fb3ae6ed9c99ffc500d6c4c; CURRENT_FNVAL=2000; sid=86toff3u"}def save(self):with open('test_b.csv','w',newline='')as f:header = ['author', 'tag', 'arcurl']f_csv=csv.DictWriter(f,fieldnames=header)f_csv.writeheader()for page in range(1,6):res=requests.get(self.url.format(page),headers=self.headers).json()for i in res['data']['result']:item=dict()item['author']=i['author']item['tag']=i['tag']item['arcurl']=i['arcurl']# print(item)f_csv.writerow(item)s=SaveVideoInfo()
s.save()

2.JSON文件存储

2.1 json数据格式介绍

JSON 全称为 JavaScript Object Notation ,也就是 JavaScript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。

常见的 json 数据格式如下:

[{"name": "Bob", "gender": "male", "birthday": "1992-10-18" }, { "name": "Selina", "gender": "female", "birthday": "1995-10-18" }
]

由中括号包围的就相当于列表类型,列表中的每一个元素可以是任意类型,这个示例中它是字典类型,由大括号包围。

json 可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。

2.2 python 中的 json 模块

方法作用
json.dumps()把 python 对象转换成 json 对象,生成的是字符串
json.dump()用于将 dict 类型的数据转成 str ,并写入到 json 文件中
json.loads()将 json 字符串解码成 python 对象
json.load()用于从 json 文件中读取数据

2.3 爬虫案例——4399网站游戏信息采集

目标地址:https://www.4399.com/flash/

import json
import requests
from lxml import etreeclass SaveInfo():def __init__(self):self.url='https://www.4399.com/flash/'self.headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'}def save(self):with open('data.json','w',encoding='utf-8') as f:res=requests.get(self.url,headers=self.headers)res.encoding='gbk'# 数据解析html=etree.HTML(res.text)data_list=html.xpath('//ul[@class="n-game cf"]/li/a')all_list=[]for i in data_list:item=dict()item['title'] = i.xpath('b/text()')[0]item['href']='https://www.4399.com'+i.xpath('@href')[0]all_list.append(item)# f.write(json.dumps(all_list))# # 禁止ascii编码f.write(json.dumps(all_list, indent=2, ensure_ascii=False))s=SaveInfo()
s.save()

3.MySQL数据库存储

在处理 python web开发或者其他需要频繁进行数据库操作的项目时,重复的打开和关闭数据库连接既消费时间也浪费资源。为了解决这个问题我们采用数据库连接池的方式复用已经创建好的连接对象,从而无需频繁的开启连接和关闭连接。

3.1 pymysql 的使用

环境准备
  • 安装pymysql
pip install pymysql -i https://pypi.douban.com/simple
  • 创建数据库
create database py_spider charset=utf8;
PyMysql连接
import pymysql# 打开数据库连接
db = pymysql.connect(host='localhost',user='root',password='000000',database='python_mysql')  # 数据库名字# 使用cursor()方法获取操作游标
cursor = db.cursor()# 关闭数据库连接
db.close()
PyMysql插入
data1,data2,data3 =2,'孜然','None'
# SQL 插入语句
sql = """INSERT INTO url_data(url_id,url_title, url_author)VALUES (%s,%s,%s)"""try:# 执行sql语句cursor.execute(sql,(data1,data2,data3))# 提交到数据库执行db.commit()print('成功')
except Exception as e:# 如果发生错误则回滚db.rollback()print(f'失败{e}')
PyMysql查询
# SQL 查询语句
sql = "SELECT * FROM url_data WHERE url_id = 1"
try:# 执行SQL语句cursor.execute(sql)# 获取所有记录列表results = cursor.fetchall()print(results)
except:print("Error: unable to fetch data")
 PyMysql更新
# 更新
"UPDATE url_data SET url_title = '番茄酱' WHERE url_id = 1;"
PyMysql删除
# 删除
"DELETE FROM url_data WHERE url_title = '番茄酱'"
 案例:

网站地址:搜索 | 腾讯招聘

import requests
import pymysql
# 网址:https://careers.tencent.com/search.html?query=at_1,at_2&keyword=python
class SaveTxWork():def __init__(self):self.url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1740891587275&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=1,2&keyword=python&pageIndex={}&pageSize=10&language=zh-cn&area=cn'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'}self.db=pymysql.connect(host='localhost',user='root',password='123456',db='py_spider')self.cursor=self.db.cursor()def get_work_info(self):for page in range(1,15):res=requests.get(self.url.format(page),headers=self.headers).json()print(f'正在抓取第{page}页面')yield res['Data']['Posts']def create_table(self):sql="""create table if not exists tx_work(id int primary key auto_increment,work_name varchar(100) not null,country_name varchar(100),city_name varchar(100),work_desc text);"""try:self.cursor.execute(sql)print('数据表创建成功')except Exception as e:print('数据表创建失败:',e)def insert_table(self,*args):sql="""insert into tx_work(id,work_name,country_name,city_name,work_desc) values (%s,%s,%s,%s,%s)"""try:self.cursor.execute(sql,args)self.db.commit()print('数据插入成功')except Exception as e:self.db.rollback()  # 回滚事务print('数据插入失败:',e)def main(self):self.create_table()all_work_generator_object=self.get_work_info()work_id=0for work_info_list in all_work_generator_object:if work_info_list:for work_info in work_info_list:work_name = work_info['RecruitPostName']country_name =  work_info['CountryName']city_name =  work_info['LocationName']work_desc =  work_info['Responsibility']self.insert_table(work_id,work_name,country_name,city_name,work_desc)else:print('数据为空')continue# 任务完成后关闭数据库连接self.db.close()if __name__=='__main__':tx_work=SaveTxWork()tx_work.main()

3.2 DBUtils 的简单使用

安装命令:
pip install DBUtils
导入模块:
from dbutils.pooled_db import PooledDB
创建数据库连接池:

使用 PooledDB 创建数据库连接池,连接池使用了一种新的 DB-API 连接方式,可以维护活动连接的池。当需要数据库连接时,直接从池中获取连接对象。完成操作后,将无需使用的连接对象返回到池中。无需频繁的关闭和开启连接。

pool = PooledDB(creator=pymysql, # 使用链接数据库的模块maxconnections=6,# 连接池允许的最大连接数,0和None表示无限制连接数mincached=2, # 初始化时,连接池中至少创建的空闲的链接,0表示不创建maxcached=2, # 链接池中最多闲置的链接,0和None不限制maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS:无用,因为pymysql和mysqldb的模块都不支持共享链接blocking=True, # 连接池中如果没有可用链接后,是否阻塞等待。False,不等待直接报错;True,等待直到有可用链接,再返回。host='127.0.0.1',port=3306,user='<username>',password='<password>',database='<database>',charset='utf8'
)
 使用数据库连接池:

连接池对象创建成功后,可以从此对象中获取链接:

# 你可以使用这个游标进行所有的常规的数据库交互操作
db_cursor=pool.connection().cursor()
查询示例:
import pymysql
from dbutils.pooled_db import PooledDB# 创建连接池对象
pool=PooledDB(creator=pymysql, # 使用链接数据库的模块maxconnections=6, # 连接池允许的最大连接数,0和None表示无限制连接数mincached=2,     # 初始化时,连接池中至少创建的空闲的链接,0表示不创建maxcached=5,    # 连接池中最多闲置的链接,0和None不限制maxshared=3,    # 链接池中最多共享的链接数量,0和None表示全部共享blocking=True, # 连接池中如果没有可用的链接后,是否阻塞等待。False,不等待直接报错,等待直到有可用链接,再返回。host='127.0.0.1',port=3306,user='root',password='123456',database='py_spider',charset='utf8'
)# 获取数据库连接
conn=pool.connection()# 获取游标
cursor=conn.cursor()# 执行查询操作
cursor.execute('SELECT * FROM tx_work')# 获取查询结果
result=cursor.fetchall()# 打印结果
print(result)# 关闭游标和连接

总结:

数据库连接池是一种节省资源并提高效率的方法,特别是在处理大量数据库操作的 web 程序和网络应用程序中。创建连接池对象并获取到游标后,游标的使用方式与 pymysql 中的游标使用方法一致,在后面的并发爬虫中,我们会利用数据库连接池完成数据的并发读写操作。

4.MongoDB数据库存储

MongoDB 是由 C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组及文档数组。

常用命令:

  1. 查询数据库:show dbs
  2. 使用数据库:use 库名
  3. 查看集合:show tables /show collections
  4. 查询表数据:db.集合名.find()
  5. 删除表:db.集合名.drop()

mongoDB在python中的基础使用

连接 MongoDB 时,我们需要使用 PyMongo 库里面的 MongoClient。一般来说,传入 MongoDB 的 IP 及端口即可,其中第一个参数为地址 host ,第二个参数为端口 port (如果不给它传递参数,默认是27017)。

import pymongo# 0.连接到 MongoDB 服务器
client=pymogo.MongoClient(host='localhost',port=27017)# 1.创建 SPIDER 数据库
db = client['SPIDER']# 3.在 SPIDER 中创建集合
collection = db['spider_1']# 5.插入一条示例数据
data1 = {"name": "example","value": 42
}data2 = {"name": "example1","value": 43
}insert_result = collection.insert_many([data1, data2])# 2.查看有什么数据库
print("所有数据库:", client.list_database_names())# 4.查看 SPIDER 中有什么集合
print("SPIDER 数据库中的集合:", db.list_collection_names())# 6.查看 spider_1 中的数据
print("spider_1 集合中的数据:")
for i in collection.find():print(i)# 7.删除一条数据
delete_result = collection.delete_one({'name': 'example'})
print(f"删除了 {delete_result.deleted_count} 条文档")# 再次查看 spider_1 中的数据
print("删除数据后 spider_1 集合中的数据:")
for i in collection.find():print(i)# 8.更新数据
# 假设我们要将 name 为 example1 的文档的 value 字段更新为 50
update_filter = {"name": "example1"}
update_data = {"$set": {"value": 50}}
update_result = collection.update_one(update_filter, update_data)print(f"更新了 {update_result.modified_count} 条文档")# 再次查看更新后 spider_1 中的数据
print("更新数据后 spider_1 集合中的数据:")
for i in collection.find():print(i)

案例——爱奇艺视频数据信息

获取到爱奇艺视频数据信息:标题、播放地址、简介

目标地址:内地电视剧大全-好看的内地电视剧排行榜-爱奇艺

import pymongo
import requestsclass AiqiyiInfo():def __init__(self):self.mongo_client=pymongo.MongoClient(host='localhost',port=27017)self.collection=self.mongo_client['py_spider']['AiQiYi']self.url='https://pcw-api.iqiyi.com/search/recommend/list?channel_id=2&data_type=1&mode=11&page_id={}&ret_num=48&session=101d987ca7d145e4a9d60b073b02d96e&three_category_id=15;must'self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'}def get_movie_info(self):for i in range(1,15):print(f'正在爬取第{i}页')res=requests.get(self.url.format(i),headers=self.headers).json()['data']['list']yield resdef parse_movie_info(self,res):item=dict()for vedio_list in res:if vedio_list:for vedio_info in vedio_list:item['name']=vedio_info ['name']item['playUrl']=vedio_info ['playUrl']item['description']=vedio_info ['description']try:self.save(item)except Exception as e:print('保存失败',e)print('保存成功')def save(self,item):if '_id' in item:del item['_id']  # 如果存在,删除该字段,让 MongoDB 自动生成唯一 _idself.collection.insert_one(item)def main(self):res=self.get_movie_info()self.parse_movie_info(res)# 程序完成后关闭数据库链接self.mongo_client.close()if __name__=='__main__':a=AiqiyiInfo()a.main()

 5.数据去重

在抓取数据的过程中可能因为网络原因造成爬虫程序崩溃退出,如果重新启动爬虫的话会造成数据入库重复的问题。下面我们使用redis来进行数据去重。

安装redis

在windows中安装redis的教程:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)_redis安装-CSDN博客

pip install redis -i https://pypi.douban.com/simple

项目需求以及思路分析

目标网址:芒果TV

思路分析:

  1. 首先判断当前网站上的数据是否为动态数据,如果为动态数据则使用浏览器抓包工具获取数据接口,当前接口地址如下:https://pianku.api.mgtv.com/rider/list/pcweb/v3?allowedRC=1&platform=pcweb&channelId=2&pn=1&pc=80&hudong=1&_support=10000000&kind=19&area=10&year=all&chargeInfo=a1&sort=c2
  2. 当获取到数据后对数据进行哈希编码,因为每一个哈希值是唯一的,所以可以利用这一特性判断数据是否重复。
  3. 将获取的数据存储到mongodb数据库中,在调用保存方法之前,先调用哈希方法将数据转为哈希并保存到redis中,再判断当前获取的数据的哈希是否存在于redis数据库,如果存在则不保存,反之亦然。

6.图片的存储

案例:王者荣耀游戏壁纸

目标网址:https://pvp.qq.com/web201605/wallpaper.shtml

import requests
import pymongo
import redis
import hashlibclass MangGuoInfo():def __init__(self):self.mongo_client=pymongo.MongoClient(host='localhost',port=27017)self.collection=self.mongo_client['MangGuo_TV']['movie_info']self.redis_client=redis.Redis()self.url='https://pianku.api.mgtv.com/rider/list/pcweb/v3?allowedRC=1&platform=pcweb&channelId=2&pn={}&pc=80&hudong=1&_support=10000000&kind=3003&area=10&year=all&feature=all&chargeInfo=a1&sort=c2'self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'}def get_movie_info(self):for i in range(1,15):print(f'正在爬取第{i}页')res=requests.get(url=self.url.format(i),headers=self.headers).json()yield res['data']['hitDocs']def parse_movie_info(self,res):for movie_list in res:if movie_list:item=dict()for movie_info in movie_list:item['title']=movie_info['title']item['subtitle']=movie_info['subtitle']item['story']=movie_info['story']self.save(item)@staticmethoddef get_md5(value):# md5方法只能接收字节数据# 计算哈希值,哈希值是唯一的,哈希值长度为32位md5_hash=hashlib.md5(str(value).encode('utf-8')).hexdigest()return md5_hashdef save(self,item):value=self.get_md5(item)# 当前返回的是redis是否成功保存md5数据,保存成功result=1,保存失败:result=0result=self.redis_client.sadd('movie:filter',value)if result:# 确保插入的数据没有 _id 字段item.pop('_id', None)self.collection.insert_one(item)print(item)print('保存成功')else:print('数据重复...')def main(self):res=self.get_movie_info()self.parse_movie_info(res)if __name__=='__main__':m=MangGuoInfo()m.main()

相关文章:

四、数据存储

在爬虫项目中&#xff0c;我们需要将目标站点数据进行持久化保存&#xff0c;一般数据保存的方式有两种&#xff1a; 文件保存数据库保存 在数据保存的过程中需要对数据完成去重操作&#xff0c;所有需要使用 redis 中的 set 数据类型完成去重。 1.CSV文件存储 1.1 什么是c…...

【原创】Ollama Test API For Linux/MacOS/Unix

安装Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y设置环境变量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"检查Ollama版本 curl http://"$IP":"$PORT&qu…...

LeetCode-Hot100-005盛最多水的容器

不懂的可以在评论区问我。 代码 双指针&#xff0c;开始的时候一个在最左边&#xff0c;一个在最右边。每次移动矮的那头&#xff0c;因为这是矮柱子作为容器能装的水的极限了。 class Solution { public:int maxArea(vector<int>& height) {int left 0; int rig…...

电源测试系统有哪些可以利用AI工具的科技??

AI技术的发展对电源模块测试系统的影响是深远的&#xff0c;不仅协助系统提升了测试效率和精度&#xff0c;还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…...

【3-3】springcloud

OpenFeign 启动OpenFeign 定义客户端接口 注入客户端并使用 OpenFeignhttp调用ribbon负载均衡 gateway 来自&#xff1a;https://mynamelancelot.github.io/spring-cloud/spring-cloud-gateway.html#cors https://blog.csdn.net/qingdao666666/article/details/119973771 …...

Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)

漏洞名称&#xff1a;Ollama /api/tags 未授权访问漏洞&#xff08;CNVD-2025-04094&#xff09; English Name&#xff1a;Ollama /api/tags Unauthorized Access Vulnerability (CNVD-2025-04094) CVSS core: 6.5 风险等级&#xff1a; 中风险 漏洞描述&#xff1a; O…...

‌Debian 包版本号比较规则详解

1 版本号组成结构 Debian 版本号格式为&#xff1a;[epoch:]upstream_version[-debian_revision] 示例‌&#xff1a;2:1.18.3~betadfsg1-5b1 组件说明比较优先级‌Epoch‌冒号前的数字 (2:)最高‌Upstream‌主版本 (1.18.3~betadfsg1)中‌Debian修订号‌减号后的部分 (5)最…...

009---基于Verilog HDL的单比特信号边沿检测

文章目录 摘要一、边沿检测二、时序逻辑实现2.1 rtl2.2 tb 三、组合逻辑实现3.1 rtl3.2 tb 摘要 文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。 一、边沿检测 边沿检测…...

2025全开源Java多语言跨境电商外贸商城/Tk/FB内嵌商城I商家入驻I批量下单I完美运行

商城程序介绍&#xff1a; 2025全新版UI 新增全球多站点选择 PC端&#xff1a;vueelementui 用户端使用&#xff1a;uniapp 管理端使用&#xff1a;vueelementui 后台服务使用&#xff1a;springbootmybatisplusmysql 商城功能介绍&#xff1a; 商城含21种语言 代理…...

iOS实现一个强大的本地状态记录容器

我们开发中经常会遇到这样的场景&#xff0c;就是我们客户端用户进行了某个操作&#xff0c;这个操作影响了数据的状态&#xff0c;但是我们又不方便重新请求一次数据&#xff0c; 这个时候&#xff0c;就需要我们记录一下本地状态在内存中&#xff0c;随着业务越来越复杂&…...

【mysql】有索引和没有索引字段更新时锁的不同

结论 对于有索引的的字段作为更新条件&#xff0c;如果更加语句用上了索引&#xff0c;那么只会在对于的更新字段的索引和对于记录的主键索引上加上x锁 如果更新字段没有索引&#xff0c;由于需要全部扫描&#xff0c;那么就会给所有主键索引加上x&#xff0c;导致其他事务的更…...

机器学习的三个基本要素

机器学习的基本要素包括模型、学习准则&#xff08;策略&#xff09;和优化算法三个部分。机器学习方法之间的不同&#xff0c;主要来自其模型、学习准则&#xff08;策略&#xff09;、优化算法的不同。 模型 机器学习首要考虑的问题是学习什么样的模型&#xff08;Model&am…...

神经机器翻译:联合学习对齐和翻译

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 神经机器翻译是最近提出的机器翻译方法。与传统的统计机器翻译不同&#xff0c;神经机器翻译旨在构建一个可以联合调整以最大化翻译性能的单一神经网络。最近为神经机器翻译提出的模型通常属于编码…...

[Web 安全] PHP 反序列化漏洞 —— PHP 魔术方法

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程&#xff0c;简单编程PHP 中&#xff0c;以两个下划线 ( __ ) 开头方法称之为 「 魔术方法 」 这些 「 魔术方法 」 在 [PHP](/l/yufei/php…...

聆听PostgreSQL数据库的使用

参考&#xff1a;&#xff08;1&#xff09;零基础入门PostgreSQL教程 &#xff08;2&#xff09;菜鸟教程 文章目录 一、PostgreSQL是什么&#xff1f;二、基本使用1.下载2.操作&#xff08;1&#xff09;数据库&#xff08;2&#xff09;表 一、PostgreSQL是什么&#xff1f;…...

2025嵌入式软件开发工程师--音频方向

一、选择题&#xff08;每题3分&#xff0c;共30分&#xff09; 1.以下哪个不是C语言中的关键字?&#xff08; &#xff09; A. int B. Float C. Define D. Return 2.以下代码的输出是: &#xff08; &#xff09; inta 5, b 10; printf("%d“, a b); A. 15 B.16 …...

C#释放内存空间的方法

目录 前言释放 C# 对象内存的六种方法1、手动释放内存空间2、使用 Using 语句3、使用 垃圾回收器4、GC.Collect() 方法5、GC.WaitForPendingFinalizers() 方法6、WeakReference 类 注意 前言 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供…...

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML...

如何将一台服务器的pip环境迁移到另一个机器?

在没有网络的情况下,将一台服务器的 pip 环境迁移到另一台机器,可按以下步骤进行操作: 步骤一:在源服务器上导出已安装的包列表 在有网络且已安装所需 Python 包的源服务器上,使用以下命令导出已安装的 Python 包列表: pip freeze > requirements.txt该命令会将当前…...

Java 入门 (超级详细)

一、什么是Java Java是一种高级编程语言&#xff0c;由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点&#xff0c;被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...