標題:世界杯開始了,大家重新燃起了看球的熱情對于游戲制作來說,往往需要開發一些角色數據,尤其是體育游戲自己設置工作量太大,主觀性太強這時候你就需要去一些權威網站查數據做參考了我根據自己的實踐經驗,教你做一個簡單的爬蟲
一期準備
我們單擊其中一個玩家進行分析:
發現所需的所有數據都在上面兩張圖的位置下面是轉賬記錄和用戶評論,現在沒有
最后一個數字230006應該是某種參數移除url后,播放器頁面仍會打開
移除玩家姓名后,您仍然可以打開頁面。
所以我們明白了—每個人的只是一個數字。
在這里,前期的重要準備工作已經完成我們找到了規則,我們需要在下一步中應用它
開始做吧。
首先,編寫用于獲取玩家數據的最重要的函數:
獲取頁面上的值
按F12查看頁面元素并獲取所需的值每個項目都不一樣,下面的展示就是我們需要的
元數據
有一段元數據沒有顯示在頁面上,其中記錄了玩家的描述我把這個記了下來,以便與同名的球員進行快速比較
過濾年份
因為想得到最新的FIFA23數據,所以過濾了左上角的年份如果不是23年,將返回空值
代碼到當前位置:
獲取位置 生日 身高 體重等信息我們可以看到,這是一個字符串
這里用的是整篇文章,省腦的辦法是換選擇器右鍵單擊要爬網的部件,并選擇復制選擇器將其復制到剪貼板
#獲取小字信息raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdiv ")
僅供參考:您也可以使用XPath進行選擇,但是您需要學習一點XPath的語法Chrome有一個XPath Helper插件,可以輕松測試XPath的語法寫得是否正確
因為球員可能有多個位置,我見過最多的人有四個位置所以我在下面的代碼里做了一個偏移量,確保截取的字符串部分是正確的
#如果有多個位置,則進行翻譯,否則截取的字符串將是錯誤的offset = raw data . find _ all( " span ")offset =(len(offset))—1 temp = raw data . text temp = re . split( ' s+ ',temp)ifoffsetgt,0:foriinrange(offset):temp . pop(I)生日信息和轉換
獲取生日信息,轉換成我們需要的格式日前,用excel打開后會自動轉換成日期格式,麻煩死了我的做法是:要么用wps,要么用fly book打開,然后再貼回去如果你有更好的想法,請留言
這是身高和體重截取字符串非常簡單
#獲取玩家的生日并轉換成所需格式Month = ( "Jan ", "Feb ", "Mar ", "Apr ", "May ", "Jun ", "Jul ", '+temp(4)(:—1)+ '— '+temp(5)(:—1)mon = temp(3)(1:)mon = Month . index(mon)+1 day = temp(4)(:—1)year = temp(5)(:—1)生日=(1
我們需要獲取頁面左側的簡介信息,包括正反腳,技能等級,攻防參與度等等。
左腳定義為1,右腳定義為2。這個神奇的數字存在于大量的項目中...而且只能微笑面對:)
# Get profile raw data = soup . select( " # body gt,div:n—child(5)gt,divgtdiv . col . col—12gt,div:n—child(2)gt,divgtul")temp=rawdata(0)find_all('li ',class_= "省略號")preferred_foot=temp(0)contents(1)preferred _ foot = 1if(preferred _ foot ' Left ')else 2 my list . end(preferred _ foot)skill _ move _ level = temp(2)contents(0)my list . end(int(skill _ move _ level))信譽=temp(3)contents(0)my list . end(int(reputation))to dostr = temp(4)
可以看到,大部分代碼只是用來拆分 拼接字符串。
頭像
#頭像rawdata=soup.selectgt,divgt,div.col.col—12gt,div.bp3—card.playergt,img")img_url=rawdata(0).get("data—src")img_r=requests.get(img_url,stream=True)#print(img_r.status_code)img_name=f"id_playerName.png"withopen(f"X:/這里是路徑,每個人不一樣,我的不能給你們看/img_name","wb")asfi:forchunkinimg_r.iter_content(chunk_size=120):fi.write(chunk)# avatar raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,img")img_url=rawdata(0)get( " data—src ")img _ r = requests . get(img _ URL,stream = True)# print(img _ r . status _ code)img _ name = f " id _ playername . png " with open(f " X:/以下是路徑每個人都不一樣我不能給你看我的
其他信息:
其他位置信息,俱樂部信息和國籍信息都使用相同的方法——在不能單擊的地方,只需右鍵單擊并復制一個選擇器。
# #獲取位置raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdivgtspan")allPos=' 'join(f " p . text " for pinrawdata)my list . end(all pos)raw data = soup . select( " # body gt,div:n—child(6)gt,divgtdiv . col . col—4gt,ulgt李:第n子(1)gt,Span ") bestpos = rawdata (0)text my list . end(bestpos)# Get Club raw data = soup . select gt,divgtdiv . col . col—12gt,div:n—child(4)gt,divgth5gta")club=rawdata(0)text iflen(rawdata)gt,0else "沒有俱樂部"myList.end(club)#獲得國籍raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdivgta")nation=rawdata(0)
精彩來了這七八十個屬性手動復制最麻煩所以我寫了這個爬蟲
發現每個屬性的值也寫在類名里,比如這個class=bp3—tag p p—73共性是bp3—tag p的部分,所以需要使用正則表達式
只是,最后把屬性以列表的形式返回,爬蟲的主要功能就完成了。
在開始下一步之前,完成編寫的函數否則來之不易的數據只存在內存中,很容易丟失很多非程序員可能不理解,這個過程叫做堅持俗話說不爭長短,只爭堅持,就是代碼的意思
建議寫Csv,其他格式也一樣如果想寫excel,推薦openpyxl庫下面是代碼部分,最長的是表格的表頭
#編寫文件DefDealwithData:header _ list =( ' id ',' name ',' birthday ',' height ',' preferred _ foot ', "skill _ ","wr_def ','Positions ','BestPosition ','Club ', ' nation ','Crossing ','Finishing ','HeadingAccuracy ','ShortPassing ','Volleys ', '/中文名。csv ',' a+ ',encoding = ' UTF—8—SIG ',newline = ' ')ASF:writer = CSV . writer(f)writer . writerow(header _ list)
另外,請搜索一下w,a和+幾種書寫方式的用法。
搜索id
怎么調用上面的函數所需玩家id從何而來
增量ID
第一次用id遞增的方式穿越,屬于廣撒網多聚魚的方式這個方法非常簡潔通過這個搜索,很多球員的數據,比如女足球員的數據,就不會顯示在網站頁面上了
#不再使用實際代碼。我這里寫個例子:so data = forsinrange (20000,40000): l = fetchdata (s) ifl!= None:so data . end(l)deallowithdata(so data)
如果用這種方式去搜索和寫一個條目,效率是很差的可以批量搜索,比如一次100條,然后整體寫寫CSV的時候可以注釋掉header_list,這樣就不需要寫那么多次頭了
Id列表
我們用一個csv文件,加上要搜索的id,然后讀取列表進行針對性搜索!
# Search List Search List = with open( '/目錄自己看/IDCSV ', "R ",編碼= ' UTF—8—SIG ') ASF: F _ CSV = CSV
就是這樣我們需要得到玩家索非亞網站的id在這里,我按名字搜索過,按ovr搜索過,按俱樂部搜索過,下面列出來
按玩家姓名搜索
在我們的網站上,通過名字搜索,會出現一個球員名單。例如,搜索華倫天奴會顯示以下玩家:
話不多說,直接上碼:
這個函數將得到所有的搜索結果如果沒有,它將返回未找到需要注意的是,會搜索到很多名字相似的玩家至于你真正需要的是哪一個,需要你自己去篩選
同樣,把要搜索的名字放在csv中,方便使用。
#讀列表搜索Search list = with open( ' to Search by name . CSV ', "r ",encoding = ' UTF—8—SIG ')ASF:F _ CSV = CSV . reader(F,dial = ' excel ',分隔符)Search list . extend(ITER(F _ CSV))# Search,注意會搜索出所有同名球員。idata = ForpinSearchlist:keyword = str(p)(2:len(p)—3)L = get playerid(keyword)IFL!= none:idata . end(l)deallowithdata(idata)由OVR搜索
按玩家總屬性值搜索。
代碼如下:
如果你搜索一個團隊,你需要知道俱樂部的id如果我們選擇球隊,你可以看到它獨特的俱樂部id和首發陣容
以下是通過俱樂部id獲取首發陣容的方法:
至于如何獲取俱樂部id,和前面的球員一樣,或者用遞增id記錄,或者搜索隊名,這里就不贅述了。
摘要
俗話說,人生苦短我用python作為一種腳本語言,速度和簡單是python最大的特點可以根據自己的需求定制這種爬蟲對于更高級的爬蟲框架,可以使用scappy等對于常用的工具功能,比如寫csv,寫 讀excel等,你可以根據自己的需要把它們寫在一個misc.py里其實因為總有新的要求,所以寫的很隨便,很多評論都沒寫這樣沒有美感新的需求接踵而至,根本沒時間重構我感謝它能跑跑完之后看到用秒退出這句話就再也不想打開了希望大家以此為戒,寫出通俗易懂的代碼
聲明:本網轉發此文章,旨在為讀者提供更多信息資訊,所涉內容不構成投資、消費建議。文章事實如有疑問,請與有關方核實,文章觀點非本網觀點,僅供讀者參考。
猜你喜歡
-
游客在進入北京環球度假區時須核驗北京健康
具體如下:北京環球度假區繼續按照相關政府部門的限流要求,以預約入園的形式加強人流動態監測和...詳情
2022-04-28
-
杭州湘湖的草坪人氣很高不少人在這里搭帳篷
湘湖邊亂搭帳篷,煞了春日風景景區出臺最新政策,將設置臨時帳篷搭建區,后續還要增設露營服務區...詳情
2022-04-14
-
南非徐霞客在云南:從行萬里路到吃百碗米線
題:南非徐霞客在云南:從行萬里路到吃百碗米線的文化之旅杜安睿來自南非,是一名國際注冊會計師...詳情
2022-04-10
-
廣州新增3例本土確診病例雙層觀光巴士全部
廣州新增3例本土確診病例雙層觀光巴士全部停運廣州市政府新聞辦公室21日公布的信息顯示,過去...詳情
2022-03-22