当前位置: 首页 > 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程序可以在不同的操作系统上运…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...