iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
AI & Data

建立FF14資訊Discord chatbot系列 第 4

[DAY 04]物品拍賣價格查詢功能(2/4)

今天主要是分享如何抓取灰機WIKI裡物品日文名稱

物品頁面的右邊會有各國的名稱,這是我們要抓取的目標區塊

一開始還沒找到解包資料時的想法是從他的物品檢索器頁面遍歷每一頁的物品

但測過幾次發現在request的時候常常會抓不到導致資料的遺漏

後來找到解包資料真的輕鬆很多

有關於物品頁面他們的網址命名規則是https://ff14.huijiwiki.com/wiki/物品:<物品名稱>

所以我們直接把Item.csvName欄位轉成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使用方法


上一篇
[DAY 03]物品拍賣價格查詢功能(1/4)
下一篇
[DAY 05]物品拍賣價格查詢功能(3/4)
系列文
建立FF14資訊Discord chatbot30

尚未有邦友留言

立即登入留言