修正 Python 爬蟲找不到元素造成運作中斷、抓取資產欄位所有的幣種資料、依錢包地址建立 csv 檔

python 爬蟲 略過無資料的 element 抓取網址最後字串為檔名

上一篇教學中,流浪貓介紹各位以 XPath 替代 class 來尋找 html 結構內特定資料。雖然這個方法能解決 class 被修改後找不到元素和網站重複使用 class 名稱的麻煩,但該爬蟲還是有不少缺陷。像是找不到目標會導致 Python 中斷、幣種增減造成欄位錯亂。

 

執行中斷的問題還算好解決,只要賦予它 try 和 except 函數即可。然而錢包內的資產來來去去,有時候會多幾款跨鏈 (IBC) 幣,有時會因挪動加密貨幣而清空錢包,使得資料欄位不斷變動。

 

站長思考了一個晚上,最後還是決定讓這支爬蟲「依錢包名稱建立獨立的 csv 檔」來解決這個問題。如此一來,就不用擔心幣種增減擠壓到其他幣種的欄位資料。

 

加密貨幣錢包地址資產監視器 - 用 XPath 擷取 html 資料

 

 

解決 Python 爬蟲找不到資料造成中斷運作的問題

由於加密貨幣地址內的資產會因使用者動用資金的關係,造成種類和數量上的變動,使得爬蟲抓不到正確的 html 資料。對於這個問題,我們可以用 try 和 except 讓爬蟲抓不到資料時,直接賦予它一個數值來解決。

 

for i in cosmos_coin:
    driver.get(i)
    time.sleep(5)
    Token_n = '/html/body/div/main/section/div/div[2]/section[2]/div/div[2]/div[2]'

    try:
        Token_n_1 = driver.find_element(By.XPATH, Token_n).text
        Token_com = re.sub(r',', '', Token_n_1) 
        Token_n_2 = re.sub(r'\n', ', ', Token_com) + ', '
    except:
        Token_n_2 = '0'

 

 

依錢包地址建立 CSV 檔

由於加密貨幣網址已經是列表資料,因此在 for i in cosmos_coin 迴圈抓取網址的同時,也能用它的 i 搭配正規表達式來產生純地址的字串。

 

cosmos_coin = ['URL-address', 'URL-address']

 

用來抓網址最後一個 / 符號後面所有字串的正規表達式

[^/]+(?=/$|$)

 

將正規表達式設為變數,以 re.findall 進行搜索和列出資料,最後就能用 file=open 將其設為檔案名稱。

pri = r'[^/]+(?=/$|$)'
f_name = re.findall(pri, i)[0]

print(file=open(f'{f_name}.csv', 'a'))

 

 

抓取資產 (Assets) 欄位內所有的加密貨幣資料

流浪貓之前很執著的想讓 Python 針對特定幣種擷取資料,但後來發現其實只要將整個資產欄位抓出來後,用 Excel 或 Calc 的公式進行整理即可。

 

用 Calc 擷取網頁資料, 製作可即時更新資料的動態表格 Excel

 

由於資產欄位預設會以換行符號 (\n) 依序列出,因此可以用逗號取代換行符號,產生標準的逗點分隔符號資料表。清零習翠帝

 

Token_n_2 = re.sub(r'\n', ', ', Token_n_1) + ', '

 

結果如下:


OSMO, Osmosis Staking Coin, 3.456, $3.3, $1.01, LIKE, IBC Token, 666.1, $3.21 , $0.00, axlUSDC, IBC Token (erc20), 87.654, $87.654, $1.00,  

 

 

完整程式碼

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import re
import time

s = Service("/home/marvin/WorkShop/PycharmProjects/chromedriver/chromedriver")
driver = webdriver.Chrome(service=s)

cosmos_coin = ['https://www.mintscan.io/cosmos/account/address',
               ]

for i in cosmos_coin:
    driver.get(i)
    time.sleep(5)
    Token_n = '/html/body/div/main/section/div/div[2]/section[2]/div/div[2]/div[2]'

    try:
        Token_n_1 = driver.find_element(By.XPATH, Token_n).text
        Token_com = re.sub(r',', '', Token_n_1) # 去除千位數逗號
        Token_n_2 = re.sub(r'\n', ', ', Token_com) + ', '
    except:
        Token_n_2 = '0'

    pri = r'[^/]+(?=/$|$)' # 擷取網址最後一個 / 之後的字串
    f_name = re.findall(pri, i)[0]

    print("\n" + time.strftime('%Y-%m-%d, %H:%M:%S'), file=open(f'/home/crawler-coin/{f_name}.csv', 'a'), end=', ')
    print(re.sub(r'\$', '', Token_n_2), end='', file=open(f'/home/crawler-coin/{f_name}.csv', 'a'))

driver.close()

 

 

 

 

延伸閱讀

加密貨幣冷錢包監視器 - Python 爬蟲

更多加密貨幣

加密貨幣錢包地址資產監視器 - 用 Python 的 XPath 擷取 html 結構資料

 

 

 

 

留言

這個網誌中的熱門文章