2022.11 蝦皮更新 API 了,因此
sentosa.py
已經無法使用
透過 Github Actions 定時觸發的機制,幫我們每天固定時間爬蟲並透過 Telegram 回傳結果(檔案)
- 動機為解決家人在工作上所面臨的需求
- 由於賣家會彼此削價競爭,隨意出價,導致商品的價格不受控制,進而使得其他正常販售商品的商家權益受損,因此需要經常確認是否有賣家隨意定價的狀況出現,並即時去處理
- 透過 python 去爬蝦皮網站,並將商品價格整理成表格
sentosa.py
是使用 Requests 直接從 API 取得商品清單shopee.py
是使用 Selenium,從網頁取得商品清單
- 整合 Github Actions,設定平日早上 10 點進行爬蟲
- 由於 Line Notify 無法傳遞檔案,因此選用 Telegram,將整理好的商品價格表格傳送給我們
- 建議 3.9 以上
- 官網連結
- 不建議用最新的版本,怕還不穩定,目前推薦用3.9.12
- 上面點進去選擇「Windows installer (64-bit)」下載安裝,步驟原則上用預設,詳細步驟可以上網隨便找教學
- Add Python 3.9 to PATH 要記得勾選!!!
- 開啟命令提示字元 (搜尋「CMD」)
- 輸入以下指令 (忽略$)
pip install jupyter notebook
- 在 CMD 輸入指令,啟動 jupyter notebook
jupyter notebook
使用 jupyter notebook 期間,CMD不能關閉
- 一般都是用 git 來 clone 專案下來,但你沒有要做版本控制的話就不需要這樣搞,直接下載壓縮檔下來解壓縮就好
- 下載方法:
- 右上點選 code
- 選擇 Download ZIP
有5個套件需要安裝,可以一次安裝一個或是一起安裝
-
一次安裝一個:
在 CMD 依序執行下面四個指令
pip install selenium
pip install pandas
pip install beautifulsoup4
pip install lxml
pip install requests
-
一起安裝:
- 打開 CMD,進到專案資料夾 (操作方法見最下方)
- 在 CMD 執行下面指令
pip install -r requirements.txt
- 在這裡下載
- 依據你的 chrome 版本選擇適當的 ChromeDriver
- 下載後解壓縮,把檔案(
chromedriver.exe
)放進專案資料夾 (跟sentosa.ipynb
同個資料夾)
打開 Chrome -> 設定 -> 關於 Chrome
- 先前啟動 jupyter notebook 會在瀏覽器開啟資料夾目錄,進到 desktop後,選擇專案資料夾內的
sentosa.ipynb
執行
- cd "資料夾名稱"
- 進入資料夾
- 註:打一個字母之後按tab可以自動補全,若有多個資料夾同樣開頭,則可以多按幾次tab
- cd ..
- 回到上一層資料夾
- 方向鍵「上」
- 顯示上次輸入的指令
- 註:再按會出現在前一次的指令
pip install virtualenv
virtualenv .venv
notify.py
是透過 Line Notify 傳送 Line 訊息- 只需要一個參數,即 Token 即可
-
在 Line Notify 登入後,從右上方進到個人頁面後,即可申請 Token
-
原則上訊息只能是下方這三種,不包含檔案(可參考API文件)
- 文字
- 圖片 (url或檔案都可以)
- 貼圖
-
由於需要讓程式碼取得 Token,因此透過 Github Actions 的 secret 來傳遞,設定方式如下
-
notify.py
內加入token = os.environ["LINE_NOTIFY_TOKEN"]
其中
INE_NOTIFY_TOKEN
是自己定義的名稱 -
在 .github/workflow 資料夾中的
main.yml
加入此步驟- name: test Line Notify env: LINE_NOTIFY_TOKEN: ${{ secrets.LINE_NOTIFY_TOKEN }} run: LINE_NOTIFY_TOKEN=$LINE_NOTIFY_TOKEN python notify.py
透過此設定方式,才能將 Github Actions 中的 secret 以環境變數的方式送入
notify.py
-
-
若不想用 python 來幫助傳遞 Line Notify 訊息,也可以透過使用他人寫好的 actions 進行,例如line-notify-actions,設定方式如下
- 在 .github/workflow 資料夾中的
main.yml
加入此步驟- name: send Line Notify message uses: louis70109/line-notify-action@master with: token: ${{ secrets.LINE_NOTIFY_TOKEN }} message: | From: ${{ github.event.sender.login }} image_file: 三多偉力健關鍵營養素.png
- 在 .github/workflow 資料夾中的
- 相較於 Line Notify 無法傳遞檔案,Telegram 可以傳遞檔案,在使用上更加方便
- 需要機器人的 Token 和 聊天室 ID
- 向 Telegram 的 BotFather 進行對話 (指令為
/newbot
),創立機器人,完成後即可取得機器人的 Token - 接下來與機器人進行對話 (輸入任意訊息即可),再進入這個網址
其中的網址中的
https://api.telegram.org/botToken/getUpdates
Token
請替換成上一步取得的機器人 Token - 觀察回傳內容 (格式為
json
),找出chat
下的id
的值,即為聊天室ID - 最後只要在 Github Actions 中進行設定
- 在 .github/workflow 資料夾中的
main.yml
加入此步驟- name: send Telegram message uses: appleboy/telegram-action@master with: to: ${{ secrets.TELEGRAM_CHAT_ID }} token: ${{ secrets.TELEGRAM_TOKEN }} message: | From: ${{ github.event.sender.login }} document: test.zip photo: 三多偉力健關鍵營養素.png
- 在 .github/workflow 資料夾中的