主頁 >  其他 > Python課程設計大作業:利用爬蟲獲取NBA比賽資料并進行機器學習預測NBA比賽結果

Python課程設計大作業:利用爬蟲獲取NBA比賽資料并進行機器學習預測NBA比賽結果

2022-03-08 07:56:16 其他

前言

該篇是之前遺漏的大三上的Python課程設計,剛好今天有空就補發了一篇文章,全部的代碼在最后附錄中,爬蟲類的代碼直接全部放到一起了,讀者可以自行研究,

百度網盤鏈接鏈接:https://pan.baidu.com/s/1sQPMbO-sy2_QqQHyMtTmUg 提取碼:mx10
在這里插入圖片描述

一、課程設計專案說明

該課程設計專案“利用爬蟲獲取NBA資料資訊并進行機器學習預測NBA比賽結果”的原型是基于網上一個教程網站“實驗樓”中的專案“使用 Python 進行 NBA 比賽資料分析”,原專案是利用Python進行對NBA的資料機器學習進行預測,在原專案之上,我對專案做出了如下更新:

1、使用Python爬蟲爬取NBA官網中的每一年的季后賽常規賽等部分專案中需要的比賽統計資料并輸出成csv格式的檔案,避免像原專案一樣,全部比賽資料需要自己從NBA網站中復制黏貼到txt文本上然后更改后綴名為csv得到資料,能夠減輕獲取資料的繁瑣作業量,
(注:原專案網站鏈接:https://www.lanqiao.cn/courses/782/learning/?id=2647)

2、對原專案代碼結合了網上資料進行自主學習,并對原專案代碼進行了改進優化,

二、課程設計專案功能

首先可通過Python爬蟲獲取來自NBA官網的任意年度的球隊資料,保存在本地檔案夾后,更改名為“NBA-nwz”的代碼中的路徑folder為資料檔案路徑,即可匯入球隊各類資料而后進行特征向量、邏輯回歸、球隊的EloScore計算等機器學習,最終將預測的比賽結果輸出到特定路徑下的格式為.csv的檔案查看比賽預測結果,

三、專案所需資料檔案

本專案中一共需要5張資料表,分別是Team Per Ganme Stats(各球隊每場比賽資料統計)、Opponent Per Game Stats(對手平均平常比賽的資料統計)、Miscellaneous Stats(各球隊綜合統計資料表)、2015-2016 NBA Schedule and Results(2015-16賽季比賽安排與結果)、2016-2017 NBA Schedule and Results(2016-2015賽季比賽安排),

四、專案原理介紹

1、比賽資料介紹

本專案中,采用來自與NBA網站的資料,在該網站中,可以獲取到任意球隊、任意球員的各類比賽統計資料,如得分、投籃次數、犯規次數等等,
(注:NBA網站鏈接https://www.basketball-reference.com/)
在這里插入圖片描述
在本網站中,主要使用2015-16賽季中的資料,分別是:
Team Per Ganme Stats表格:每支隊伍平均每場比賽的表現統計;
Opponent Per Game Stats表格:所遇到的對手平均每場比賽的統計資訊,所包含的統計資料與 Team Per Game Stats 中的一致,只是代表的是該球隊對應的對手的統計資訊;
Miscellaneous Stats:綜合統計資料,(在網站中名為Advanced Stats,)
在這里插入圖片描述
Team Per Game Stats表格、Opponent Per Game Stats表格、Miscellaneous Stats表格(在NBA網站中叫做“Advanced Stats”)中的資料欄位含義如下圖所示,
在這里插入圖片描述
在這里插入圖片描述
除了上述的三張表外,還需要另外兩張表資料,分別是:
2015-2016 NBA Schedule and Results:2015-2016 年的 NBA 常規賽及季后賽的每場比賽的比賽資料;2016-2017 NBA Schedule and Results 中 2016-2017 年的 NBA 的常規賽比賽安排資料,
在這里插入圖片描述
在獲取到資料之后,需要對表格的欄位做出更改如下圖所示,
表格資料欄位含義說明:Vteam: 客場作戰隊伍,Hteam: 主場作戰隊伍
在這里插入圖片描述
故綜上所述一共需要5張NBA資料表,如下圖所示,
在這里插入圖片描述

2、資料分析原理

在獲取到五個表格資料之后,將利用每支隊伍過去的比賽情況和 Elo 等級分來分析每支比賽隊伍的勝利概率,

分析與評價每支隊伍過去的比賽表現時,將使用到上述五張表中的三張表,分別是 Team Per Game Stats、Opponent Per Game Stats 和 Miscellaneous Stats(后文中將簡稱為 T、O 和 M 表),

這三個表格的資料,作為代表比賽中某支隊伍的比賽特征,代碼將實作針對每場比賽,預測哪支隊伍最侄訓勝,但這并不是給出絕對的勝敗情況,而是預判勝利的隊伍有多大的獲勝概率,

因此將建立一個代表比賽的特征向量,由兩支隊伍的以往比賽統計情況(T、O 和M表)和兩個隊伍各自的 Elo 等級分構成,

3、Elo Score等級分制度

Elo 機制現在廣泛運用于網路游戲或競技類運動中,根據Elo等級分制度對各個選手(玩家)進行登記劃分,如王者榮耀、籃球、足球比賽等等,Elo Score等級分制度本身是國際象棋中基于統計學的一個評估棋手水平能力的方法,

通過Elo制度來計算選手(玩家)的勝率期望值的原理程序如下:

假設A與B當前的等級制度分為與,那么A對B的勝率期望值為:

在這里插入圖片描述
B對A的勝率期望值為:

在這里插入圖片描述
如果A在比賽中真實得分與他的勝率期望值不同,那么A的等級分要根據以下公式進行調整:

在這里插入圖片描述
另外在國際象棋中,根據等級分的不同 K 值也會做相應的調整:大于等于2400,K=16,2100-2400 分,K=24,小于等于2100,K=32,

在專案中,將會用以表示某場比賽資料的特征向量為:

[A隊 Elo score,A隊的 T,O和M 表統計資料,B隊 Elo score, B隊的 T,O和M 表統計資料],

4、機器學習

對于全部隊伍,在最開始沒有Elo分數時,賦予初始值init_elo=1600,然后根據資料計算每支球隊Elo等級分,代碼如下圖所示:

在這里插入圖片描述
而后根據資料表中的資料,及每支隊伍的Elo計算結果,建立對應的2015-2016年常規賽和季后賽中每場比賽的資料集,因為NBA中有主客場制度,所以在比賽時,認為主場作戰的隊伍更加有優勢,因此會在代碼中加上100的等級分,

在這里插入圖片描述
而后在main函式呼叫上述函式方法,且使用sklearn的Logistic Regression方法建立回歸模型,

Logistic Regression(邏輯回歸)方法:
邏輯回歸:一種用于解決二分類(0 or 1)問題的機器學習方法,用于估計某種事物的可能性,比如某用戶購買某商品的可能性等,簡單的來說,就是學習我們設計好的向量資料,從中得到一個概率模型,然后輸入其他資料,就能根據訓練出來的模型得到其結果,

接著使用通過10折交叉驗證計算訓練正確率,
10折交叉驗證(10-fold cross validation):

常用的測驗方法,將資料集分成十分,輪流將其中9份作為訓練資料,1份作為測驗資料,進行試驗,每次試驗都會得出相應的正確率(或差錯率),10次的結果的正確率(或差錯率)的平均值作為對演算法精度的估計,一般還需要進行多次10折交叉驗證(例如10次10折交叉驗證),再求其均值,作為對演算法準確性的估計,

最后使用訓練好的模型在2016-2017年的常規賽資料中進行預測,匯入16-17資料,就可以利用模型對一場新的比賽進行勝負的判斷,并且回傳勝率的概率,

五、專案實施

在原網站的教程中,需要將網頁的資料復制下來到txt文本上然后更改后綴名為.csv格式,比較繁瑣,

在課程設計中,我更新為以爬蟲獲取資料,這里以爬取Team Per Game表代碼為例,更改爬蟲代碼中的url代碼部分,運行即可爬取對應賽季的Team Per Ganme Stats(各球隊每場比賽資料統計)、Opponent Per Game Stats(對手平均平常比賽的資料統計)表格,而后將會自動將爬取的表格輸出為.csv檔案在爬蟲代碼的同路徑下,
在這里插入圖片描述
在“NBA-nwz.py”代碼中,設定好全部資料檔案的folder路徑,如下圖所示,(圖片中的py檔案名為test.py)然后運行代碼,即可獲得預測結果匯出了,

在這里插入圖片描述
在匯出的檔案prediction of 2016-2017中可以看到如下預測資料,

在這里插入圖片描述

在這里插入圖片描述

六、專案總結

1、實驗程序問題總結

在寫代碼的時候,有一個包一直下載不了,各種報錯,根據網上的方法找了一個小時左右,試了很多種方法才解決掉,在這里記錄一下,起因就是這個parsel包import不了,一直會報同一個錯誤:在這里插入圖片描述
CondaHTTPError:HTTP 000 CONNECTION FAILED for url
https://mirrors.tuna.tsinghua.edu.cn/anaconda/.
應該是最開始自己安裝python環境的時候使用的anaconda沒有配置好,或者說這個源不起作用了,于是首先嘗試了第一種方法找到.condarc檔案,更改里面的channels通道地址,但是當我根據網上的指導教程換國科大、阿里等信號源后依然出現錯誤,

后面找到了一篇文章,說是需要將https://改為 http即可,剛看到的時候以為不是這個問題,后面實在是沒辦法了,被這個問題搞得頭大,一個多小時了卡著,只好死馬當活馬醫,更改了一下https為http,并配入了清華源的最新配置channels,沒想到解決了!

可以通過cmd命令 conda info查看自己的channels路徑配置,

在這里插入圖片描述
也可以通過在.condarc檔案直接更改即可,進行如下配置即可輕松擁有速度較快的安裝包速度了!

在這里插入圖片描述

2、專案展望

總的來說,專案還是有一些小不足和繼續優化的,例如在5張表中,爬下來就可以立即使用的只有三張表,分別是 Team Per Game Stats、Opponent Per Game Stats 和 Miscellaneous Stats,另外爬下來的表格需要進行欄位處理,去掉不需要的欄位,并且更改欄位名等才能使用,而Python中是可以做到自動化處理資料欄位的,這一點沒有較好的實作,

除此之外,還可以使用Python可視化來做到更好的展示出比賽中兩個隊哪個勝率更高,
這一點我曾嘗試過,但是由于效果并不是很完美,就沒有放到設計專案中來,

以及在10折交叉驗證中,可以看出正確率接近70%左右,感徑訓可以在機器學習及資料處理(選用資料)方面再下一些功夫,達到更高的正確率,

在這里插入圖片描述
因為機器學習是我自己課余時間學習過一點點的小教程,所以了解接觸并不是很深,做的并不是特別完善,有機會可以多更改,進一步完善優化,

附錄:全部代碼

進行預測的代碼:

import pandas as pd
import math
import numpy as np
import csv
from sklearn import linear_model
from sklearn.model_selection import cross_val_score

init_elo = 1600 # 初始化elo值
team_elos = {}
folder = 'D:\pydzy\py-n'  # 檔案路徑

def PruneData(M_stat, O_stat, T_stat):
    #這個函式要完成的任務在于將原始讀入的諸多隊伍的資料經過修剪,使其變為一個以team為索引的排列的特征資料
    #丟棄與球隊實力無關的統計量
    pruneM = M_stat.drop(['Rk', 'Arena'],axis = 1)
    pruneO = O_stat.drop(['Rk','G','MP'],axis = 1)
    pruneT = T_stat.drop(['Rk','G','MP'],axis = 1)
    
    #將多個資料通過相同的index:team合并為一個資料
    mergeMO = pd.merge(pruneM, pruneO, how = 'left', on = 'Team')
    newstat = pd.merge(mergeMO, pruneT,  how = 'left', on = 'Team')
    
    #將team作為index的資料回傳
    return newstat.set_index('Team', drop = True, append = False)

def GetElo(team):
    # 初始化每個球隊的elo等級分
    try:
        return team_elos[team]
    except:
        team_elos[team] = init_elo
    return team_elos[team]

def CalcElo(winteam, loseteam):
    # winteam, loseteam的輸入應為字串
    # 給出當前兩個隊伍的elo分數
    R1 = GetElo(winteam)
    R2 = GetElo(loseteam)
    # 計算比賽后的等級分,參考elo計算公式
    E1 = 1/(1 + math.pow(10,(R2 - R1)/400))
    E2 = 1/(1 + math.pow(10,(R1 - R2)/400))
    if R1>=2400:
        K=16
    elif R1<=2100:
        K=32
    else:
        K=24
    R1new = round(R1 + K*(1 - E1))
    R2new = round(R2 + K*(0 - E2))
    return R1new, R2new

def GenerateTrainData(stat, trainresult):
    #將輸入構造為[[team1特征,team2特征],...[]...]
    X = []
    y = []
    for index, rows in trainresult.iterrows():
        winteam = rows['WTeam']
        loseteam = rows['LTeam']
        #獲取最初的elo或是每個隊伍最初的elo值
        winelo = GetElo(winteam)
        loseelo = GetElo(loseteam)
        # 給主場比賽的隊伍加上100的elo值
        if rows['WLoc'] == 'H':
            winelo = winelo+100
        else:
            loseelo = loseelo+100
        # 把elo當為評價每個隊伍的第一個特征值
        fea_win = [winelo]
        fea_lose = [loseelo]
        # 添加我們從basketball reference.com獲得的每個隊伍的統計資訊
        for key, value in stat.loc[winteam].iteritems():
            fea_win.append(value)
        for key, value in stat.loc[loseteam].iteritems():
            fea_lose.append(value)
        # 將兩支隊伍的特征值隨機的分配在每場比賽資料的左右兩側
        # 并將對應的0/1賦給y值        
        if np.random.random() > 0.5:
            X.append(fea_win+fea_lose)
            y.append(0)
        else:
            X.append(fea_lose+fea_win)
            y.append(1)
        # 更新team elo分數
        win_new_score, lose_new_score = CalcElo(winteam, loseteam)
        team_elos[winteam] = win_new_score
        team_elos[loseteam] = lose_new_score
    # nan_to_num(x)是使用0代替陣列x中的nan元素,使用有限的數字代替inf元素
    return np.nan_to_num(X),y
        
def GeneratePredictData(stat,info):
    X=[]
    #遍歷所有的待預測資料,將資料變換為特征形式
    for index, rows in stat.iterrows():
        
        #首先將elo作為第一個特征
        team1 = rows['Vteam']
        team2 = rows['Hteam']
        elo_team1 = GetElo(team1)
        elo_team2 = GetElo(team2)
        fea1 = [elo_team1]
        fea2 = [elo_team2+100]
        #球隊統計資訊作為剩余特征
        for key, value in info.loc[team1].iteritems():
            fea1.append(value)
        for key, value in info.loc[team2].iteritems():
            fea2.append(value)
        #兩隊特征拼接
        X.append(fea1 + fea2)
    #nan_to_num的作用:1將串列變換為array,2.去除X中的非數字,保證訓練器讀入不出問題
    return np.nan_to_num(X)

if __name__ == '__main__':
    # 設定匯入資料表格檔案的地址并讀入資料
    M_stat = pd.read_csv(folder + '/15-16Miscellaneous_Stat.csv')
    O_stat = pd.read_csv(folder + '/15-16Opponent_Per_Game_Stat.csv')
    T_stat = pd.read_csv(folder + '/15-16Team_Per_Game_Stat.csv')
    team_result = pd.read_csv(folder + '/2015-2016_result.csv')
    
    teamstat = PruneData(M_stat, O_stat, T_stat)
    X,y = GenerateTrainData(teamstat, team_result)

    # 訓練網格模型
    limodel = linear_model.LogisticRegression()
    limodel.fit(X,y)

    # 10折交叉驗證
    print(cross_val_score(model, X, y, cv=10, scoring='accuracy', n_jobs=-1).mean())

    # 預測
    pre_data = pd.read_csv(folder + '/16-17Schedule.csv')
    pre_X = GeneratePredictData(pre_data, teamstat)
    pre_y = limodel.predict_proba(pre_X)
    predictlist = []
    for index, rows in pre_data.iterrows():
        reslt = [rows['Vteam'], pre_y[index][0], rows['Hteam'], pre_y[index][1]]
        predictlist.append(reslt)
    
    # 將預測結果輸出保存為csv檔案
    with open(folder+'/prediction of 2016-2017.csv', 'w',newline='') as f:
        writers = csv.writer(f)
        writers.writerow(['Visit Team', 'corresponding probability of winning', 'Home Team', 'corresponding probability of winning'])
        writers.writerows(predictlist)

爬蟲代碼:

import requests
import re
import csv
from parsel import Selector

class NBASpider:

    def __init__(self):
        self.url = "https://www.basketball-reference.com/leagues/NBA_2021.html"
        self.schedule_url = "https://www.basketball-reference.com/leagues/NBA_2016_games-{}.html"
        self.advanced_team_url = "https://www.basketball-reference.com/leagues/NBA_2016.html"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 "
                          "Safari/537.36"
        }

    # 發送請求,獲取資料
    def send(self, url):
        response = requests.get(url, headers=self.headers, timeout=30)
        response.encoding = 'utf-8'
        return response.text

    # 決議html
    def parse(self, html):
        team_heads, team_datas = self.get_team_info(html)
        opponent_heads, opponent_datas = self.get_opponent_info(html)
        return team_heads, team_datas, opponent_heads, opponent_datas

    def get_team_info(self, html):
        """
        通過正則從獲取到的html頁面資料中team表的表頭和各行資料
        :param html 爬取到的頁面資料
        :return: team_heads表頭
                 team_datas 串列內容
        """
        # 1. 正則匹配資料所在的table
        team_table = re.search('<table.*?id="per_game-team".*?>(.*?)</table>', html, re.S).group(1)
        # 2. 正則從table中匹配出表頭
        team_head = re.search('<thead>(.*?)</thead>', team_table, re.S).group(1)
        team_heads = re.findall('<th.*?>(.*?)</th>', team_head, re.S)
        # 3. 正則從table中匹配出表的各行資料
        team_datas = self.get_datas(team_table)

        return team_heads, team_datas

    # 決議opponent資料
    def get_opponent_info(self, html):
        """
        通過正則從獲取到的html頁面資料中opponent表的表頭和各行資料
        :param html 爬取到的頁面資料
        :return:
        """
        # 1. 正則匹配資料所在的table
        opponent_table = re.search('<table.*?id="per_game-opponent".*?>(.*?)</table>', html, re.S).group(1)
        # 2. 正則從table中匹配出表頭
        opponent_head = re.search('<thead>(.*?)</thead>', opponent_table, re.S).group(1)
        opponent_heads = re.findall('<th.*?>(.*?)</th>', opponent_head, re.S)
        # 3. 正則從table中匹配出表的各行資料
        opponent_datas = self.get_datas(opponent_table)

        return opponent_heads, opponent_datas

    # 獲取表格body資料
    def get_datas(self, table_html):
        """
        從tboday資料中決議出實際資料(去掉頁面標簽)
        :param table_html 決議出來的table資料
        :return:
        """
        tboday = re.search('<tbody>(.*?)</tbody>', table_html, re.S).group(1)
        contents = re.findall('<tr.*?>(.*?)</tr>', tboday, re.S)
        for oc in contents:
            rk = re.findall('<th.*?>(.*?)</th>', oc)
            datas = re.findall('<td.*?>(.*?)</td>', oc, re.S)
            datas[0] = re.search('<a.*?>(.*?)</a>', datas[0]).group(1)
            datas.insert(0, rk[0])
            # yield 宣告這個方法是一個生成器, 回傳的值是datas
            yield datas

    def get_schedule_datas(self, table_html):
        """
        從tboday資料中決議出實際資料(去掉頁面標簽)
        :param table_html 決議出來的table資料
        :return:
        """
        tboday = re.search('<tbody>(.*?)</tbody>', table_html, re.S).group(1)
        contents = re.findall('<tr.*?>(.*?)</tr>', tboday, re.S)
        for oc in contents:
            rk = re.findall('<th.*?><a.*?>(.*?)</a></th>', oc)
            datas = re.findall('<td.*?>(.*?)</td>', oc, re.S)
            if datas and len(datas) > 0:
                datas[1] = re.search('<a.*?>(.*?)</a>', datas[1]).group(1)
                datas[3] = re.search('<a.*?>(.*?)</a>', datas[3]).group(1)
                datas[5] = re.search('<a.*?>(.*?)</a>', datas[5]).group(1)

            datas.insert(0, rk[0])
            # yield 宣告這個方法是一個生成器, 回傳的值是datas
            yield datas

    def get_advanced_team_datas(self, table):
        trs = table.xpath('./tbody/tr')
        for tr in trs:
            rk = tr.xpath('./th/text()').get()
            datas = tr.xpath('./td[@data-stat!="DUMMY"]/text()').getall()
            datas[0] = tr.xpath('./td/a/text()').get()
            datas.insert(0, rk)
            yield datas

    def parse_schedule_info(self, html):
        """
        通過正則從獲取到的html頁面資料中的表頭和各行資料
        :param html 爬取到的頁面資料
        :return: heads表頭
                 datas 串列內容
        """
        # 1. 正則匹配資料所在的table
        table = re.search('<table.*?id="schedule" data-cols-to-freeze=",1">(.*?)</table>', html, re.S).group(1)
        table = table + "</tbody>"
        # 2. 正則從table中匹配出表頭
        head = re.search('<thead>(.*?)</thead>', table, re.S).group(1)
        heads = re.findall('<th.*?>(.*?)</th>', head, re.S)
        # 3. 正則從table中匹配出表的各行資料
        datas = self.get_schedule_datas(table)

        return heads, datas

    def parse_advanced_team(self, html):
        """
        通過xpath從獲取到的html頁面資料中表頭和各行資料
        :param html 爬取到的頁面資料
        :return: heads表頭
                 datas 串列內容
        """

        selector = Selector(text=html)
        # 1. 獲取對應的table
        table = selector.xpath('//table[@id="advanced-team"]')
        # 2. 從table中匹配出表頭
        res = table.xpath('./thead/tr')[1].xpath('./th/text()').getall()
        heads = []
        for i, head in enumerate(res):
            if '\xa0' in head:
                continue
            heads.append(head)
        # 3. 匹配出表的各行資料
        table_data = self.get_advanced_team_datas(table)
        return heads, table_data

    # 存盤成csv檔案
    def save_csv(self, title, heads, rows):
        f = open(title + '.csv', mode='w', encoding='utf-8', newline='')
        csv_writer = csv.writer(f)
        csv_writer.writerow(heads)
        for row in rows:
            csv_writer.writerow(row)

        f.close()

    def crawl_team_opponent(self):
        # 1. 發送請求
        res = self.send(self.url)
        # 2. 決議資料
        team_heads, team_datas, opponent_heads, opponent_datas = self.parse(res)
        # 3. 保存資料為csv
        self.save_csv("team", team_heads, team_datas)
        self.save_csv("opponent", opponent_heads, opponent_datas)

    def crawl_schedule(self):
        months = ["october", "november", "december", "january", "february", "march", "april", "may", "june"]
        for month in months:
            html = self.send(self.schedule_url.format(month))
            # print(html)
            heads, datas = self.parse_schedule_info(html)
            # 3. 保存資料為csv
            self.save_csv("schedule_"+month, heads, datas)

    def crawl_advanced_team(self):
        # 1. 發送請求
        res = self.send(self.advanced_team_url)
        # 2. 決議資料
        heads, datas = self.parse_advanced_team(res)
        # 3. 保存資料為csv
        self.save_csv("advanced_team", heads, datas)

    def crawl(self):
        # 1. 爬取各隊伍資訊
        # self.crawl_team_opponent()
        # 2. 爬取計劃表
        # self.crawl_schedule()
        # 3. 爬取Advanced Team表
        self.crawl_advanced_team()

if __name__ == '__main__':
    # 運行爬蟲
    spider = NBASpider()
    spider.crawl()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439202.html

標籤:AI

上一篇:使用回圈將陣列串列中的元素乘以向量

下一篇:服務器conda+pytorch安裝教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more