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

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...