Tuesday Sep 17, 2024

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 直接找機器人ㄅ

我是Vinc ,下個紀錄見

Vinc

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Back to Top