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

python项目(豆瓣电影)

目录

1、项目效果

2、项目源码

3、技术实现

4、总结



前言

        我的这个项目是做的一个豆瓣电影爬取,爬取了豆瓣电影的TOP排行榜的数据 包括电影的名称 演员 评分 评价人数等等 运用了TK布局助手 布了4个界面 有登录 注册 首页 详情

        注意:项目并没有连接数据库 

一、项目效果

                                                    登录 

                                                      注册

 首页

详情



二、项目源码

登录 

from tkinter import *
from tkinter.ttk import *from tkinter import Button
import subprocess
from tkinter import messageboxclass WinGUI(Tk):def __init__(self):super().__init__()self.__win()self.name_var = "root"  # 固定的姓名self.password_var = "123"  # 固定的密码self.tk_label_lwudgfpe = self.__tk_label_lwudgfpe(self)self.tk_label_lwudgqcp = self.__tk_label_lwudgqcp(self)self.tk_input_lwudhq1s = self.__tk_input_lwudhq1s(self)self.tk_input_lwudi5tc = self.__tk_input_lwudi5tc(self)self.tk_button_lwudit80 = self.__tk_button_lwudit80(self)self.tk_button_zc = self.__tk_button_zc(self)# 设置主窗口的背景颜色# self.config(bg='#B0E2FF')def __win(self):self.title("登录")# 设置窗口大小、居中width = 400height = 300screenwidth = self.winfo_screenwidth()screenheight = self.winfo_screenheight()geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)self.geometry(geometry)self.resizable(width=False, height=False)def scrollbar_autohide(self, vbar, hbar, widget):"""自动隐藏滚动条"""def show():if vbar: vbar.lift(widget)if hbar: hbar.lift(widget)def hide():if vbar: vbar.lower(widget)if hbar: hbar.lower(widget)hide()widget.bind("<Enter>", lambda e: show())if vbar: vbar.bind("<Enter>", lambda e: show())if vbar: vbar.bind("<Leave>", lambda e: hide())if hbar: hbar.bind("<Enter>", lambda e: show())if hbar: hbar.bind("<Leave>", lambda e: hide())widget.bind("<Leave>", lambda e: hide())def v_scrollbar(self, vbar, widget, x, y, w, h, pw, ph):widget.configure(yscrollcommand=vbar.set)vbar.config(command=widget.yview)vbar.place(relx=(w + x) / pw, rely=y / ph, relheight=h / ph, anchor='ne')def h_scrollbar(self, hbar, widget, x, y, w, h, pw, ph):widget.configure(xscrollcommand=hbar.set)hbar.config(command=widget.xview)hbar.place(relx=x / pw, rely=(y + h) / ph, relwidth=w / pw, anchor='sw')def create_bar(self, master, widget, is_vbar, is_hbar, x, y, w, h, pw, ph):vbar, hbar = None, Noneif is_vbar:vbar = Scrollbar(master)self.v_scrollbar(vbar, widget, x, y, w, h, pw, ph)if is_hbar:hbar = Scrollbar(master, orient="horizontal")self.h_scrollbar(hbar, widget, x, y, w, h, pw, ph)self.scrollbar_autohide(vbar, hbar, widget)def __tk_label_lwudgfpe(self, parent):label = Label(parent, text="用户名", anchor="center", )label.place(x=20, y=60, width=80, height=38)return labeldef __tk_label_lwudgqcp(self, parent):label = Label(parent, text="密码", anchor="center", )label.place(x=20, y=140, width=78, height=38)return labeldef __tk_input_lwudhq1s(self, parent):ipt = Entry(parent, )ipt.place(x=117, y=60, width=263, height=39)self.ipt1 = iptreturn iptdef __tk_input_lwudi5tc(self, parent):ipt = Entry(parent, )ipt.place(x=117, y=140, width=258, height=39)self.ipt2 = iptreturn iptdef __tk_button_lwudit80(self, parent):btn = Button(parent, text="登录", takefocus=False, )btn.place(x=120, y=220, width=79, height=41)# 添加事件绑定btn.bind("<Button-1>", self.on_login_click)  # <Button-1> 是鼠标左键点击的事件return btndef __tk_button_zc(self,parent):btn = Button(parent,text="注册",takefocus=False,)btn.place(x=250, y=220, width=79, height=41)btn.bind("<Button-1>", self.on_zc_click)  # <Button-1> 是鼠标左键点击的事件return btn# 添加一个新的方法作为回调函数# 登录def on_login_click(self, event):# 输入框里值entered_name = self.ipt2.get()entered_password =self.ipt1.get()if self.password_var== entered_name and self.name_var== entered_password:self.run_index_script()else:# 显示错误提示messagebox.showerror("登录失败", "账号或密码不正确,请重新输入。")# 添加一个新的方法作为回调函数# 注册def on_zc_click(self, event):try:# 使用subprocess模块启动新的Python脚本subprocess.Popen(['python', 'register.py'])# 关闭当前窗口# self.destroy()except Exception as e:print(f"Error occurred while running index.py: {e}")def run_index_script(self):try:# 使用subprocess模块启动新的Python脚本subprocess.Popen(['python', 'index.py'])# 关闭当前窗口# self.destroy()except Exception as e:print(f"Error occurred while running index.py: {e}")def __event_bind(self):passdef __style_config(self):passif __name__ == "__main__":win = WinGUI()win.mainloop()

注册(与登录页面相似,只是判断不相同)

  # 添加一个新的方法作为回调函数def on_register_click(self, event):# 输入框里的值# 注册新用户new_username = self.ipt2.get().strip()new_password = self.ipt1.get().strip()if new_username and new_password:messagebox.showinfo("注册", "注册成功!")else:messagebox.showwarning("注册", "用户名或密码不能为空!")

 首页(布局是运用了TK助手 大家可自行设置 我这里只展示了部分功能性代码)

def thread_it(func, *args):"""将函数打包进线程(重要):param func::param args::return:"""# 创建t = Thread(target=func, args=args)# 守护# t.setDaemon(True)# 启动t.start()class movie_ui():# def ll(self):def __init__(self):self.jsonData = []def clear_treeview(self, tree):"""清空表格:param tree::return:"""rows = tree.get_children()for r in rows:tree.delete(r)def add_treeview(self, rows, tree):"""新增表格数据:param rows::param tree::return:"""for r in rows:tree.insert('', END, values=(r['title'], r['rank'], r['score'], r['vote_count']))def select_treeview(self, event):"""treeview行双击选中事件:return:"""# 获取选中的treeview数据行item = self.movie_tv.selection()values = self.movie_tv.item(item, "values")print(values[0])try:# 跳转详情页面d = WinGUI()with open('movies.json', 'r', encoding='utf-8') as fp:# 获取json数据movies = json.load(fp)for movie in movies:if movie['title'].__contains__(values[0]):# 将值绑定到详情信息文本框中d.mc.insert("1.0", movie["title"])d.pj.insert("1.0", movie["score"])d.rq.insert("1.0", movie["release_date"])d.lx.insert("1.0", movie["types"])d.yy.insert("1.0", movie["actors"])except Exception as e:print(f"Error occurred while running index.py: {e}")def do_search_top(self):"""排行榜查询按钮事件:return:"""# 清空表格self.clear_treeview(self.movie_tv)# 设置按钮为灰色self.btn_top['state'] = DISABLED# 下拉框的数据jsonMovieData = loads(movieData)# 循环获取选择下拉框中选中的值movie_type = Nonefor subMovieData in jsonMovieData:if subMovieData['title'] == self.movie_combo.get():movie_type = subMovieData['type']break# 调用查询接口获取数据res = get_movie_top(movie_type)# 判断是否成功if res['code'] == 200:self.jsonData = res['movies']self.add_treeview(res['movies'], self.movie_tv)else:messagebox.showinfo('提示', res['msg'][:1000])# 按钮设置为正常状态self.btn_top['state'] = NORMALdef do_search_kw(self):"""关键字查询按钮事件:return:"""# 清空表格self.clear_treeview(self.movie_tv)# 设置按钮为灰色self.btn_top['state'] = DISABLEDself.btn_keyword['state'] = DISABLED# 调用查询接口获取数据res = get_movie_kw(self.movie_keyword_entry.get())# 判断是否成功if res['code'] == 200 and len(res['movies']) > 0:self.jsonData = res['movies']self.add_treeview(res['movies'], self.movie_tv)else:messagebox.showwarning('提示', '请输入关键字!')# 按钮设置为正常状态# 从排行榜搜索self.btn_top['state'] = NORMAL# 从关键字搜索self.btn_keyword['state'] = NORMAL

 详情

from tkinter import *
from tkinter.ttk import *class WinGUI(Tk):def __init__(self):super().__init__()self.__win()self.tk_label_frame_lwym93kr = self.__tk_label_frame_lwym93kr(self)self.tk_label_lwym9yej = self.__tk_label_lwym9yej( self.tk_label_frame_lwym93kr)self.tk_label_lwymcscf = self.__tk_label_lwymcscf( self.tk_label_frame_lwym93kr)self.tk_label_lwymdu0i = self.__tk_label_lwymdu0i( self.tk_label_frame_lwym93kr)self.tk_label_lwymfoy1 = self.__tk_label_lwymfoy1( self.tk_label_frame_lwym93kr)self.tk_label_lwymgb8y = self.__tk_label_lwymgb8y( self.tk_label_frame_lwym93kr)self.tk_text_lwymink1 = self.__tk_text_lwymink1( self.tk_label_frame_lwym93kr)self.tk_text_lwynp020 = self.__tk_text_lwynp020( self.tk_label_frame_lwym93kr)self.tk_text_lwynpnhj = self.__tk_text_lwynpnhj( self.tk_label_frame_lwym93kr)self.tk_text_lwynq5ny = self.__tk_text_lwynq5ny( self.tk_label_frame_lwym93kr)self.tk_text_lwynqjmm = self.__tk_text_lwynqjmm( self.tk_label_frame_lwym93kr)# 设置主窗口的背景颜色# self.config(bg='#B0E2FF')def __win(self):self.title("豆瓣电影TOP250")# 设置窗口大小、居中width = 730height = 370screenwidth = self.winfo_screenwidth()screenheight = self.winfo_screenheight()geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)self.geometry(geometry)self.resizable(width=False, height=False)def scrollbar_autohide(self,vbar, hbar, widget):"""自动隐藏滚动条"""def show():if vbar: vbar.lift(widget)if hbar: hbar.lift(widget)def hide():if vbar: vbar.lower(widget)if hbar: hbar.lower(widget)hide()widget.bind("<Enter>", lambda e: show())if vbar: vbar.bind("<Enter>", lambda e: show())if vbar: vbar.bind("<Leave>", lambda e: hide())if hbar: hbar.bind("<Enter>", lambda e: show())if hbar: hbar.bind("<Leave>", lambda e: hide())widget.bind("<Leave>", lambda e: hide())def v_scrollbar(self,vbar, widget, x, y, w, h, pw, ph):widget.configure(yscrollcommand=vbar.set)vbar.config(command=widget.yview)vbar.place(relx=(w + x) / pw, rely=y / ph, relheight=h / ph, anchor='ne')def h_scrollbar(self,hbar, widget, x, y, w, h, pw, ph):widget.configure(xscrollcommand=hbar.set)hbar.config(command=widget.xview)hbar.place(relx=x / pw, rely=(y + h) / ph, relwidth=w / pw, anchor='sw')def create_bar(self,master, widget,is_vbar,is_hbar, x, y, w, h, pw, ph):vbar, hbar = None, Noneif is_vbar:vbar = Scrollbar(master)self.v_scrollbar(vbar, widget, x, y, w, h, pw, ph)if is_hbar:hbar = Scrollbar(master, orient="horizontal")self.h_scrollbar(hbar, widget, x, y, w, h, pw, ph)self.scrollbar_autohide(vbar, hbar, widget)def __tk_label_frame_lwym93kr(self,parent):frame = LabelFrame(parent,text="电影详情",)frame.place(x=18, y=11, width=698, height=346)return framedef __tk_label_lwym9yej(self,parent):label = Label(parent,text="影片名称",anchor="center", )label.place(x=58, y=11, width=120, height=38)return labeldef __tk_label_lwymcscf(self,parent):label = Label(parent,text="电影评价",anchor="center", )label.place(x=59, y=71, width=119, height=37)return labeldef __tk_label_lwymdu0i(self,parent):label = Label(parent,text="电影日期",anchor="center", )label.place(x=60, y=131, width=119, height=39)return labeldef __tk_label_lwymfoy1(self,parent):label = Label(parent,text="电影类型",anchor="center", )label.place(x=60, y=191, width=119, height=39)return labeldef __tk_label_lwymgb8y(self,parent):label = Label(parent,text="电影演员",anchor="center", )label.place(x=60, y=251, width=119, height=39)return label# 电影演员def __tk_text_lwymink1(self,parent):self.yy = Text(parent)self.yy.place(x=218, y=250, width=444, height=60)return self.yy# 电影名称def __tk_text_lwynp020(self,parent):self.mc = Text(parent)self.mc.place(x=279, y=10, width=299, height=41)return self.mc# 电影评价def __tk_text_lwynpnhj(self,parent):self.pj = Text(parent)self.pj.place(x=280, y=72, width=299, height=37)return self.pj# 电影日期def __tk_text_lwynq5ny(self,parent):self.rq = Text(parent)self.rq.place(x=280, y=131, width=298, height=36)return self.rq# 电影类型def __tk_text_lwynqjmm(self,parent):self.lx = Text(parent)self.lx.place(x=280, y=191, width=298, height=38)return self.lxclass Win(WinGUI):def __init__(self, controller):self.ctl = controllersuper().__init__()self.__event_bind()self.__style_config()self.ctl.init(self)def __event_bind(self):passdef __style_config(self):pass
if __name__ == "__main__":win = WinGUI()win.mainloop()

爬取代码 

import json
import urllib
from json import loadsfrom urllib import requestimport requests
from requests_html import HTMLSession
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import BymovieData = ' [' \'{"title":"纪录片", "type":"1", "interval_id":"100:90"}, ' \' {"title":"传记", "type":"2", "interval_id":"100:90"}, ' \' {"title":"犯罪", "type":"3", "interval_id":"100:90"}, ' \' {"title":"历史", "type":"4", "interval_id":"100:90"}, ' \' {"title":"动作", "type":"5", "interval_id":"100:90"}, ' \' {"title":"情色", "type":"6", "interval_id":"100:90"}, ' \' {"title":"歌舞", "type":"7", "interval_id":"100:90"}, ' \' {"title":"儿童", "type":"8", "interval_id":"100:90"}, ' \' {"title":"悬疑", "type":"10", "interval_id":"100:90"}, ' \' {"title":"剧情", "type":"11", "interval_id":"100:90"}, ' \' {"title":"灾难", "type":"12", "interval_id":"100:90"}, ' \' {"title":"爱情", "type":"13", "interval_id":"100:90"}, ' \' {"title":"音乐", "type":"14", "interval_id":"100:90"}, ' \' {"title":"冒险", "type":"15", "interval_id":"100:90"}, ' \' {"title":"奇幻", "type":"16", "interval_id":"100:90"}, ' \' {"title":"科幻", "type":"17", "interval_id":"100:90"}, ' \' {"title":"运动", "type":"18", "interval_id":"100:90"}, ' \' {"title":"惊悚", "type":"19", "interval_id":"100:90"}, ' \' {"title":"恐怖", "type":"20", "interval_id":"100:90"}, ' \' {"title":"战争", "type":"22", "interval_id":"100:90"}, ' \' {"title":"短片", "type":"23", "interval_id":"100:90"}, ' \' {"title":"喜剧", "type":"24", "interval_id":"100:90"}, ' \' {"title":"动画", "type":"25", "interval_id":"100:90"}, ' \' {"title":"同性", "type":"26", "interval_id":"100:90"}, ' \' {"title":"西部", "type":"27", "interval_id":"100:90"}, ' \' {"title":"家庭", "type":"28", "interval_id":"100:90"}, ' \' {"title":"武侠", "type":"29", "interval_id":"100:90"}, ' \' {"title":"古装", "type":"30", "interval_id":"100:90"}, ' \' {"title":"黑色电影", "type":"31", "interval_id":"100:90"}' \']'# 电影类型
def get_movie_top(m_type: str):"""排行榜查询方法https://movie.douban.com/j/chart/top_list?type=&interval_id=100:90&action=unwatched&start=0&limit=:param m_type: 电影类型:param num:    爬取数量:param rating: 影片评分:param pj:     评价人数:return:"""try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}# url = 'https://movie.douban.com/j/chart/top_list?type=' + str(#     m_type) + '&interval_id=100:90&action=unwatched&start=0&limit=' + str(num)# req = request.Request(url=url, headers=headers)# # 用于打开一个远程的url连接,并且向这个连接发出请求,获取响应结果# f = request.urlopen(req)# # 获取响应对象# response = f.read()# # 将json转为python对象# jsonData = loads(response)url = "https://movie.douban.com/j/chart/top_list"params = {"type": m_type,"interval_id": "100:90","action": "unwatched","start": "0",# 固定每次搜索条数为50条"limit": 50}resp = requests.get(url, headers=headers, params=params)jsonData = resp.json()movies_list = []# 循环获取的电影信息并提取有效数据for subData in jsonData:# 将评分设定为大于1.0以上 评价人数大于100000if (float(subData['score']) >= float(1.0)) and (float(subData['vote_count']) >= float(100000)):movie = {"title": subData["title"],"rank": subData["rank"],"cover_url": subData["cover_url"],"types": "/".join(subData["types"]),"regions": subData["regions"][0],"release_date": subData["release_date"],"vote_count": subData["vote_count"],"score": subData["score"],"actors": "/".join(subData["actors"])}movies_list.append(movie)with open('movies.json', 'w', encoding='utf-8') as fp:json.dump(movies_list, fp, ensure_ascii=False, indent=2)return {'code': 200, 'movies': movies_list}except Exception as ex:err_str = "出现未知异常:{}".format(ex)return {'code': 500, 'msg': err_str}def get_movie_kw2(kw:str):params = {"search_text": "指环王","cat": "1002"}session = HTMLSession(browser_args=['--no-sand','--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'])resp = session.get("https://search.douban.com/movie/subject_search", params=params)resp.html.render()html = resp.html;movies_list = []divs = html.xpath("//div[@class='item-root'")print(divs)return movies_listdef get_movie_kw(kw: str):"""基于关键字查询电影信息https://movie.douban.com/subject_search?search_text=&cat=1002:param kw::return:"""chrome_options = Options()# 设置为无头模式,即不显示浏览器chrome_options.add_argument('--headless')# 设置user=agentchrome_options.add_argument('user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"')# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium# chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])# # 不加载图片,加快访问速度# chrome_options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 加载chromedriver驱动是否成功load_driver_success = Falsebrowser = Nonetry:# 设置chromedriver驱动路径browser = webdriver.Chrome(options=chrome_options)# 页面加载超时时间为10sbrowser.set_page_load_timeout(10)# 页面js加载超时时间为10sbrowser.set_script_timeout(10)load_driver_success = Trueexcept Exception as ex:load_driver_success = Falseerr_str = "加载chromedriver驱动失败,请下载chromedriver驱动并填写正确的路径。\n\n异常信息:{}".format(ex)return {'code': 500, 'msg': err_str}if load_driver_success:# print(load_driver_success)try:url = 'https://search.douban.com/movie/subject_search?search_text=' + urllib.parse.quote(kw) + '&cat=1002'# print(url)# get方式获取返回数据browser.get(url)# 通过样式选择器获取满足div.item-root要求的所有数据divs = browser.find_elements(By.CSS_SELECTOR, "div.item-root")movies_list = []for div in divs:movie = {"title": '',"rank": '',"cover_url": '',"types": '',"regions": '',"release_date": '',"vote_count": '',"score": '',"actors": ''}cover_url = div.find_elements_by_css_selector(".cover")# print(cover_url)if cover_url:movie["cover_url"] = cover_url[0].get_attribute("src")movie["title"] = cover_url[0].get_attribute("alt")rating = div.find_elements_by_css_selector("span.rating_nums")if rating:movie["score"] = rating[0].textpl = div.find_elements_by_css_selector("span.pl")if pl:movie["vote_count"] = pl[0].text.replace("(", "").replace(")", "").replace("人评价", "")regions = div.find_elements_by_css_selector("div.abstract")if regions:movie["regions"] = regions[0].textactors = div.find_elements_by_css_selector("div.abstract_2")if actors:movie["actors"] = actors[0].textmovies_list.append(movie)return {'code': 200, 'movies': movies_list}except Exception as ex:# 关闭浏览器browser.quit()err_str = "chromedriver驱动加载成功,但是Selenium获取数据出现其他未知异常:{}".format(ex)return {'code': 200, 'msg': err_str}if __name__ == "__main__":# movies = get_movie_top("25", 20, 8.8, 100000)# movies = get_movie_kw("指环王")movies = get_movie_kw2("指环王")print(movies)# for m in movies['movies']:#     print(m)


三、技术实现

tkinter 布局

json   获取数据

thread  线程

requests 模块

selenium 爬取



四、总结

        此次项目结合了许多之前学过的知识 有最基本的python语法 也有界面的融合 还有selenium数据的爬取 字典 集合 列表 函数 方法也有用到 

        其实可以连接数据库效果会更好 大家可以去尝试一下

相关文章:

python项目(豆瓣电影)

目录 1、项目效果 2、项目源码 3、技术实现 4、总结 前言 我的这个项目是做的一个豆瓣电影爬取&#xff0c;爬取了豆瓣电影的TOP排行榜的数据 包括电影的名称 演员 评分 评价人数等等 运用了TK布局助手 布了4个界面 有登录 注册 首页 详情 注意&#xff1a;项目并没有连接数…...

精选网络安全书单:打造数字世界的钢铁长城!

目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术&#xff1a;攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南&#xff1a;密码应用与数据安全…...

Ubuntu由于没有公钥,无法验证下列签名。

其他操作系统报错也一样处理&#xff0c;我kali的也是这样解决的。 使用sudo apt update时出现以下错误&#xff1a; 3B4FE6ACC0B21F32就是公钥&#xff0c;每个人的不一样&#xff0c;注意看自己的报错信息 :~$ sudo apt update [sudo] ts 的密码&#xff1a; 命中:1 http:…...

水库安全监测系统:智慧水文动态监测系统

TH-SW2水库安全监测系统&#xff0c;作为一款智慧水文动态监测系统&#xff0c;其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术&#xff0c;为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…...

下载centos7镜像及在VMware上安装Linux (Centos7)操作系统详细教程

文章目录 下载centos7镜像文件及在VMware上安装centos7详细教程一、下载Centos7镜像二、 利用VM安装Centos7进入VM软件安装配置虚拟机 安装Centos7进入图形化界面配置 三、访问外网 配置IP地址结语Linux配置IP网卡Linux配置本地yum源 下载centos7镜像文件及在VMware上安装cento…...

【全开源】考试答题系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署。 &#x1f4dd;考试答题系统&#xff1a;便捷高效的学习新选择&#x1f4a1; &#x1f4da; 考试答题系统是什么&#xff1f; 考试答题系统&…...

toB市场 | 我们喜欢赞助这样的展会活动

过去的六一儿童节&#xff0c;刚去成都参加了个行业内的展会。受护网行动、儿童节等等的影响&#xff0c;这次去成都的客户并不算太多&#xff0c;但会议延续了一贯的高品质&#xff0c;让我们收货满满。 选择目标受众来得多的展会 不同厂商会视自己的产品和模式、目标客户来…...

【学习笔记】Git常用命令

目录 Git常用命令1. git init &#xff08;初始化一个新的Git仓库&#xff09;2. git clone [url] &#xff08;克隆远程仓库到本地计算机&#xff09;3. git status &#xff08;查看当前工作区的状态&#xff09;4. git add [file] &#xff08;将文件添加到暂存区&#xff0…...

【C/C++】IO流

目录 前言&#xff1a; 一&#xff0c;C语言的I/O流 二&#xff0c;C的I/O流 2-1&#xff0c;C标准IO流 2-2&#xff0c;IO流的连续输入 前言&#xff1a; “流”即是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且具有方向性的数据…...

Vite5+Vue3整合Tailwindcss详细教程

创建vite项目 执行命令&#xff1a; npm create vite启动项目 npm install -g pnpm pnpm i pnpm dev浏览器访问 http://localhost:5174/ 整合Tailwindcss 安装依赖 pnpm install -D tailwindcss postcss autoprefixer初始化配置文件 npx tailwindcss init用webstorm打开…...

小程序 UI 风格魅力非凡

小程序 UI 风格魅力非凡...

【常用工具系列】Git 教程——从入门到大师

目录 前言一、Git 基础1-1、Git 简介与安装安装 Git 1-2、 Git 工作流程1-3、 Git 配置与管理用户配置查看配置 1-4、 Git 仓库操作克隆仓库推送更改拉取更新 1-5 Git 分支管理创建分支切换分支删除分支解决冲突 二、 Git 进阶2-0、 Git 标签使用创建标签查看标签检出标签推送标…...

每天坚持写java锻炼能力---第一天(6.4)

今天的目标是菜单&#xff1a; B站/马士兵的项目菜单 package java1;import java.util.Scanner;public class Test {public static void main(String[] args) {while(true){ //3.加入死循环&#xff0c;让输入一直有System.out.println();System.out.println("--->项…...

mysql 如何分布式部署

MySQL的分布式部署是一个涉及多个步骤和配置的过程&#xff0c;以确保数据库系统能够支持大规模数据存储、高并发访问和容错性。以下是MySQL分布式部署的主要步骤和要点&#xff0c;结合参考文章中的相关信息进行整理&#xff1a; 一、前期准备 环境准备&#xff1a; 选择合…...

Git的概念

Git 一些概念 **工作区&#xff1a;**电脑上你能看到的目录 **版本库&#xff1a;**工作区的隐藏目录.git。含 暂存区&#xff1a;git add后但未git commit的文件修改被添加到暂存区本地分支&#xff1a;git commit后&#xff0c;但未git push&#xff0c;即把暂存区的所有…...

【每日刷题】Day58

【每日刷题】Day58 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c;​​​​​​​ 1. 3038. 相同分数的最大操作数目 I - 力扣&#xff08;LeetCode&#xff09; 2. 868. …...

Python 的七个HTTP请求库对比

Python HTTP请求库对比 库名称特点优点缺点requests简单易用的HTTP库&#xff0c;基于urllib3。- 语法简洁- 社区支持强大- 易于上手和维护- 阻塞式调用&#xff0c;不支持异步操作- 相比aiohttp体积较大http.clientPython标准库中的低级HTTP库。- 无需安装第三方库- 提供底层…...

顶顶通呼叫中心中间件-如何配置识别不同语种的ASR

文章目录 前言联系我们创建不同语种的语音识别任务开始对接识别不同语种的ASR重启 asrproxy 程序使用识别不同语种的ASR 前言 之前讲过顶顶通的 asrproxy 程序如何对接第三方的ASR&#xff0c;比如&#xff1a;阿里云的ASR。不知道如何对接的&#xff0c;可以参考&#xff1a;…...

C# SolidWorks 二次开发-显示配置

在 SolidWorks 的二次开发中&#xff0c;显示配置&#xff08;Display States&#xff09;是一个非常重要的功能。显示配置允许用户在同一个配置&#xff08;Configuration&#xff09;下保存不同的显示状态&#xff0c;如隐藏或显示的零件、不同的颜色和材质等。本文将向新的开…...

PXE自动装机

一、PXE概述 PXE&#xff1a;c/s架构&#xff0c;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 c/s 架构&#xff1a;服务端和客户端都可以是多台。 无人值守&#xff1a;安装选…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

20个超级好用的 CSS 动画库

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

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...