大家好,我是Python進階者。
一、前言玩過王者榮耀游戲的小伙伴們都知道英雄出裝是十分重要的事情,一個合理的出裝,再加上銘文,可以讓你在王者戰(zhàn)場上勢如破竹,unstoppable!
前幾天在【明佬】群里看到他分享了一個使用Python網(wǎng)絡(luò)爬蟲獲取王者榮耀英雄出裝說明,并使用線程池的方式下載了出裝圖片,之后還自動化生成了markdown文件,干貨內(nèi)容很多,這里拿出來分享給大家,歡迎大家積極嘗試。
二、數(shù)據(jù)獲取這里我們的目標(biāo)網(wǎng)站是王者榮耀官網(wǎng),如下圖所示。
之后依次點擊首頁右側(cè)中的【英雄/皮膚】的【更多】按鈕,可以進入到詳情頁,如下圖所示,點擊【局內(nèi)道具】就可以看到出裝信息了,里邊包含了我們想要的目標(biāo)信息。
通過瀏覽器抓包,可以獲取到具體的信息,可以看到存放在json
格式中。
下圖是數(shù)據(jù)詳情截圖,可以看到有中文亂碼,這個不影響,起碼數(shù)據(jù)是可以拿到的。
代碼實現(xiàn)過程找到數(shù)據(jù)源之后,接下來就是代碼實現(xiàn)了,一起來看看吧,這里直接套用【明佬】代碼,在jupyter notebook
中跑的。
獲取裝備數(shù)據(jù)import requests import pandas as pd headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/88.0.4324.104 Safari/537.36 ' } target = 'https://pvp.qq.com/web201605/js/item.json' item_list = requests.get(target, headers=headers).json() item_df = pd.DataFrame(item_list) item_df.sort_values(["item_type" , "price" , "item_id" ], inplace=True) item_df.fillna("" , inplace=True) item_df.des1 = item_df.des1.str.replace("</?p>" , "" , regex=True) item_df.des2 = item_df.des2.str.replace("</?p>" , "" , regex=True) item_df
結(jié)果如下圖所示:
多線程下載圖片接下來使用線程池的方法下載圖片,圖片的拼接方法也很簡單,看下圖就一目了然了。
下面是代碼實現(xiàn):
import os from concurrent.futures import ThreadPoolExecutor def download_img(item_id): if os.path.exists(f"imgs/{item_id}.jpg" ): return imgurl = f"http://game./images/yxzj/img201606/itemimg/{item_id}.jpg" res = requests.get(imgurl) with open(f"imgs/{item_id}.jpg" , "wb" ) as f: f.write(res.content) os.makedirs("imgs" , exist_ok=True) with ThreadPoolExecutor(max_workers=8) as executor: nums = executor.map(download_img, item_df.item_id)
下載速度很快,幾秒鐘的事情,結(jié)果如下圖所示:
接下來,我們將數(shù)據(jù)自動化生成Markdown文檔,一起來看看吧。
生成Markdown文檔代碼如下,前面部分是數(shù)據(jù)的預(yù)處理,后面是寫入文件:
item_type_dict = {1: '攻擊' , 2: '法術(shù)' , 3: '防御' , 4: '移動' , 5: '打野' , 7: '游走' } item_ids = item_df.item_id.values item_df.item_id = item_df.item_id.apply( lambda item_id: f"![{item_id}](imgs/{item_id}.jpg)" ) item_df.item_type = item_df.item_type.map(item_type_dict) item_df.columns = ["圖片" , "裝備名稱" , "類型" , "售價" , "總價" , "基礎(chǔ)描述" , "擴展描述" ] item_df
寫入文件的代碼,生成Markdown文檔:
with open("王者裝備說明.md" , "w" ) as f: for item_type, item_split in item_df.groupby("類型" , sort=False): f.write(f"# {item_type}\n" ) item_split.drop(columns="類型" , inplace=True) f.write(item_split.to_markdown(index=False)) f.write("\n\n" )
結(jié)果如下圖所示:
之后在本地還會生成一個名為【王者裝備說明.md】的Markdown文檔,雙擊文件打開,內(nèi)容如下圖所示:
真是直呼好家伙!我在這一步實現(xiàn)的時候,遇到了一個報錯,如下所示:
Missing optional dependency 'tabulate' . Use pip or conda to install tabulate.
提示卻少依賴庫,只需要在cmd
下進行安裝即可pip install tabulate
,之后就可以正常運行了。
生成Excel表格不過Markdown的表格無法任意調(diào)整,圖片需要點擊后才會放大,下面我們考慮生成Excel表格:首先需要整理數(shù)據(jù),代碼如下:
item_df.圖片 = "" item_df.基礎(chǔ)描述 = item_df.基礎(chǔ)描述.str.replace("<br>" , "\n" ) item_df.擴展描述 = item_df.擴展描述.str.replace("<br>" , "\n" ) item_df
生成結(jié)果如下圖所示:
之后將結(jié)果寫入到Excel
中去,代碼如下所示:
# 寫入Excel表格 from openpyxl.drawing.image import Image from openpyxl.styles import Alignment with pd.ExcelWriter("王者裝備說明.xlsx" , engine='openpyxl' ) as writer: item_df.to_excel(writer, sheet_name='裝備說明' , index=False) worksheet = writer.sheets['裝備說明' ] worksheet.column_dimensions["A" ].width = 11 for item_id, (cell,) in zip(item_ids, worksheet.iter_rows(2, None, 1, 1)): worksheet.row_dimensions[cell.row].height = 67 worksheet.add_image(Image(f"imgs/{item_id}.jpg" ), f'A{cell.row}' ) worksheet.column_dimensions["F" ].width = 15 worksheet.column_dimensions["G" ].width = 35 writer.save()
打開文件,效果圖如下圖所示:
當(dāng)然了,大家也可以根據(jù)自己想要的效果生成HTML和Word等等。
三、總結(jié)大家好,我是Python進階者。這篇文章主要分享了一個使用Python網(wǎng)絡(luò)爬蟲獲取王者榮耀英雄出裝說明,并使用線程池的方式下載了出裝圖片,之后還自動化生成了markdown文件,干貨內(nèi)容很多,歡迎大家積極嘗試,如果有遇到問題,請?zhí)砑游液糜?,我?guī)椭鉀Q。
最后感謝粉絲【明佬】分享的代碼喝王者榮耀出裝攻略,真是太強了,上王者指日可待!