修正 Python 爬蟲找不到元素造成運作中斷、抓取資產欄位所有的幣種資料、依錢包地址建立 csv 檔
上一篇教學中,流浪貓介紹各位以 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 的 XPath 擷取 html 結構資料
留言
張貼留言
由於廣告留言太多,因此改採審核發佈,請耐心等候。
無法留言?請點我