EVGA 台灣 顯示卡存貨爬蟲紀錄
大哥在其他顯卡廠商漲價的同時,持續提供相對便宜接近 MSRP 的價格
受到網友的愛戴
這個是 Discord BOT 查詢 EVGA 有無存貨的部分程式碼
構思架構
先知道了 EVGA 顯示卡頁面
https://tw.evga.com/Products/ProductList.aspx?type=0
我們要爬的是有貨的型號
首先就找到有貨 ( 即可以直接可以購買的型號
使用瀏覽器 F12功能查看網頁原始碼 , 觀察到
class ="grid-item-outer"
繼續比對這邊與沒貨的多了 CSS 屬性
class = "pl-grid-buttons"
藉由屬性判斷是否有存貨
取得型號和購買連結
title="View Details"
取得價格
class ="pl-grid-price"
然後 Python 根據上面構思逐步寫出程式
由於意外處理要寫好,因為 EVGA 時不時網站就跳過載
header這些細節就略過
連入後優先確認 HTTP 狀態碼
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
res = requests.get(
"https://tw.evga.com/Products/ProductList.aspx?type=0", headers=headers)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
else:
return "error"
然後照著絲路取得
接著用 BeautifulSoup 尋找
class ="main-product"
我很懶所以直接find_all() 搜尋
在main-product 下尋找 grid-item-outer ( 型號的外框 )
接著用if 判斷 grid-item-outer 下是否找到 pl-grid-buttons
加完就長這樣
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
res = requests.get(
"https://tw.evga.com/Products/ProductList.aspx?type=0", headers=headers)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
for item in soup.find_all("div", class_="main-product"):
for product in item.find_all(class_="grid-item-outer"):
if product.find(class_="pl-grid-buttons"):
else:
return "error"
若找到則繼續照上述
之後照著上面思路一步一步完成程式
型號
取得的型號要做處理 , 簡潔化成現 ( EVGA 型號真的太長了
用 ", " 分割產品名和數字型號和一些賣點
只取list的第一個
價格
比較重要是該 class 下有個 strong 標籤 ,物盡其用直接取得價格
取得價格後再加以處理 , 用 replace() 從字串中刪除 "," ( 數字中間有逗號很奇怪 , 讓人比較好閱讀而以
連結
在型號同樣位置直接 get ('href') 取得相對應網址
再加上域名
新增完就是這樣
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
res = requests.get(
"https://tw.evga.com/Products/ProductList.aspx?type=0", headers=headers)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
for item in soup.find_all("div", class_="main-product"):
for product in item.find_all(class_="grid-item-outer"):
if product.find(class_="pl-grid-buttons"):
model_name = product.find(
title="View Details").get_text().split(", ")
model_price = product.find(
class_="pl-grid-price").strong.get_text().replace(",", "")
model_url = "https://tw.evga.com" + \
product.find(title="View Details").get('href')
else:
return "error"
後續資料處理及排序
把資料放入 dict 字典中
再將 dict 字典放入 list 中
之後再去照 dict 的價格,重排 list 中的 dict 順序
from operator import itemgetter
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
res = requests.get(
"https://tw.evga.com/Products/ProductList.aspx?type=0", headers=headers)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
for item in soup.find_all("div", class_="main-product"):
for product in item.find_all(class_="grid-item-outer"):
if product.find(class_="pl-grid-buttons"):
model_name = product.find(
title="View Details").get_text().split(", ")
model_price = product.find(
class_="pl-grid-price").strong.get_text().replace(",", "")
model_url = "https://tw.evga.com" + \
product.find(title="View Details").get('href')
model_dic = {
'name': model_name[0], 'price': model_price, 'url': model_url}
item_list.append(model_dic)
item_list.sort(key=lambda x: int(itemgetter("price")(x)))
return "success"
else:
return "error"
結尾
EVGA TW STOCK Discord Bot 程式源碼
https://github.com/vincent-chang-rightfighter/EVGA-TW-STOCK-Discord-Bot
機器人不要架了EVGA 馬鈴薯承受不住這種摧殘
去 Jing 的 Discord 直接找機器人ㄅ