今天主要是分享如何抓取灰機WIKI裡物品日文名稱
物品頁面的右邊會有各國的名稱,這是我們要抓取的目標區塊
一開始還沒找到解包資料時的想法是從他的物品檢索器頁面遍歷每一頁的物品
但測過幾次發現在request的時候常常會抓不到導致資料的遺漏
後來找到解包資料真的輕鬆很多
有關於物品頁面他們的網址命名規則是https://ff14.huijiwiki.com/wiki/物品:<物品名稱>
所以我們直接把Item.csv
的Name
欄位轉成list格式遍歷每個物品的網址就可以了
附上爬取資料的程式碼,由於我有限3秒爬一次頁面,記得花了我四天才爬完
最後將資料存成CSV檔
import requests
import time
import pandas as pd
from bs4 import BeautifulSoup
from urllib import request
from urllib.parse import quote
import opencc
if __name__ == "__main__":
rawdf = pd.read_csv("FF14_rawitem.csv")
rawdf.dropna(subset=["簡體中文"],inplace=True)
url = "https://ff14.huijiwiki.com"
item_list = set(rawdf["簡體中文"].tolist())
df = pd.DataFrame()
converter = opencc.OpenCC('s2t.json')
header = {"user-agent": "Mozilla/5.0 ((Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
for cnname in item_list:
try:
sub_url = url+f"/wiki/%E7%89%A9%E5%93%81:{cnname}"
req = requests.get(sub_url, headers=header, timeout = 60)
time.sleep(3)
soup = BeautifulSoup(req.text, "html.parser")
item_list = soup.select('div[class="ff14-content-box-block"] > ul[class="img-v-align-baseline"] > li')[:5]
ct_text = converter.convert(item_list[0].text)
item_df = pd.DataFrame(data={"繁體中文":[ct_text[1:]],
"簡體中文":[item_list[0].text[1:]],
"日文":[item_list[1].text[1:]],
"英文":[item_list[2].text[1:]],
"法文":[item_list[3].text[1:]],
"德文":[item_list[4].text[1:]]})
# time.sleep(3)
except BaseException:
print(cnname)
continue
df = df.append(item_df)
print(f"{cnname} complete")
df.to_csv("FF14_item.csv",encoding="utf-8-sig",index=0)
接下來跟解包的資料進行合併,主要是合併ID
這個欄位
合併的程式碼我也一併附上:
import pandas as pd
import pickle
if __name__ == '__main__':
#用於處理rawdata轉字典格式
df = pd.read_csv("FF14_rawitem.csv")
df = df[["ID","英文"]]
base_df = pd.read_csv("FF14_item.csv")
all_df = pd.merge(base_df,df, how="left", on=["英文"])
for column_name in list(all_df.columns):
all_df[column_name] = all_df[column_name].map(str)
#建立item字典
item_dict = {}
column_list = list(all_df.columns)
for index,row in all_df.iterrows():
for word in column_list:
sub_dict={}
column_list2 = list(all_df.columns)
column_list2.remove(word)
for i in column_list2:
sub_dict[str(i)] = str(row[i])
item_dict[str(row[word])] = sub_dict
#輸出字典
with open("item_dict.pkl", "wb") as tf:
pickle.dump(item_dict,tf)
明天會介紹Discord python API使用方法