分類 Python 中的文章

我要訂便當 (5): Heroku 填坑小記

在上一集的 將 Python 腳本部署上 Heroku 中,記錄了將 Python 腳本放上 Heroku 的過程,但仍然沒有將我們的 訂便當小幫手 給放上去。之前有稍微提到是因為過程中遇到了一些問題,最後決定將這些問題和找到的前人解決文記錄在這一篇,將來再遇到的時候就可以參考。

  1. SQLite 要改成用 PostgreSQL
  2. 在 Heroku 上執行 Selenium

一、SQLite 要改成用 PostgreSQL

在之前的 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單 中,為了方便及簡單性,選擇了較輕便的 SQLite 來儲存我們爬回來的訂單資訊。然而,SQLite 將資料儲存在小檔案以便於攜帶的做法,在 Heroku 上將會遭遇像是各個 dyno 的資料不同步等許多問題,因此 Heroku 是不建議使用 SQLite 的。

在 Heroku 的開發文件中的 SQLite on Heroku 有關於這部分的詳細說明,並直接提到「If you were to use SQLite on Heroku, you would lose your entire database at least once every 24 hours.」同時,官方也提供了他們的建議:PostgreSQL。相較於輕便但只能同時單一寫入而且還會在 dyno 炸掉的 SQLite,PostgreSQL 的完整性更符合 Heroku 對服務的要求。

關於在 Heroku 上使用 PostgreSQL 的做法,這篇 佈署 Python Flask 網站留言板應用程式到 Heroku + PostgreSQL 資料庫系統 說明得相當詳細。

……

閱讀全文


我要訂便當 (4): 將 Python 腳本部署上 Heroku

目標:紀錄一下如何將 Python 寫好的東西丟上 Heroku

在先前的 訂便當系列 中已經建立了一個替我們去爬便當網並通知我們的小工具,但還存在一個相當大的問題:要在哪跑?總不能就只放在家裡電腦有開機就跑、沒開機就算了吧?因此我們必須找個主機把它放上去。而在上一篇做 Line Notify 的時候所參考的 如何快速建置一個 LINE Notify 的服務 中提到了將服務放上 Heroku 的部分,因此馬上嘗試看看。

結果過程中碰了不少壁,因此特地紀錄下來。

Heroku 是一個雲端平台,讓使用者可以把服務丟上去跑,同時最讚的部分是,免費用戶就提供了每月 450 小時可以使用(但有每半小時會進入休眠的限制),詳情可以參閱 Heroku 的計費頁面

本系列最後一階段的目標就是要將訂便當爬蟲整套丟上去雲端上運行,達到被動接收通知的效果。但由於訂便當爬蟲還牽涉到用 Selenium 開瀏覽器互動,以及使用 Sqlite 儲存的部分,轉移到 Heroku 的環境上還需要進行一些調整。因此這一階段將會分成兩篇(或以上)文章進行,上篇會先簡單地紀錄如何將服務放上 Heroku,下篇開始則著重於紀錄將訂便當系統放上 Heroku 時遇到的問題和解決過程

本篇主要的參考來源來自於 搭配 Git 在 Heroku 上部署網站的手把手教學發布網站到 Heroku 以及 網站部署(使用 Heroku) 這幾篇,其餘參考將附於文末,感謝各位前人大大留下的優質文。

……

閱讀全文


我要訂便當 (3): 用 Python + Line Notify 傳送通知

前情提要:

我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單 中,我們嘗試了用 Selenium 控制瀏覽器去取回訂便當團購網的訂單內容

而在 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單 中,我們使用 Sqlite 達到將訂單儲存起來以判斷是否有新的訂單,因此這邊的下一步就是需要進行通知。

目標:使用 Line Notify,當有新訂單的時候就發送通知

Line Notify 是 Line 上面的通知服務,不像 Line@ 一樣可以有品牌有互動等等,Line Notify 純粹就是訊息通知;但同時對比 Line@ 最近吵得沸沸揚揚的收費和大量跳槽,Line Notify 則是免費的服務。

Line Notify 的運作上分為發送訊息和接受訊息。當我們使用 Line 帳號申請 Line Notify 的服務後就可以得到一個 Access Token,藉由這組 Access Token 就能夠讓我們的程式和服務去發送通知。這些通知會由一個叫做 LINE Notify 的官方帳號發送給有訂閱這個通知的人。

基於這個工作原理,像是需要經營品牌的服務就不太適合 Line Notify,反之像是伺服器斷線、設備超載等等這些個人通知性質比較高的服務就很適合使用 Line Notify。這點從 Line Notify 網頁 下方的示意圖也可以略知一二。

當然像我們這次的需求是「如果有新的團購便當 就 通知我」,相當符合使用場景,因此這邊就嘗試使用看看並記錄下來。

如果需要更多 Line Notify 的說明,保哥的這篇 上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法 介紹的更為完整,推薦參閱。當然,也可以閱讀 Line Notify 官方文件。那麼,我們開始吧~

……

閱讀全文


SikuliX —— 針對圖形介面寫自動化腳本的小幫手

最近因緣際會下開始玩一些自動化測試的小工具,發現即使不是用在正規的測試時也相當實用,畢竟我們這行能讓電腦自動幫我們省事就是一種樂趣嘛。正巧這禮拜比較忙,無法準時推出訂便當系列的續集,因此決定直接紀錄一下試玩 Sikulix 的過程,以後有需要自動化的時候也方便回來參考。

Sikulix 是一款針對圖形介面編寫腳本達到自動操作的軟體,操作上相當方便。主要是將目標的圖示等畫面擷取下來,再編寫程式對目標進行操作。它編寫腳本時使用的語言是 Jython —— 用 Java 實現的 Python,關於 Jython 的基本操作可以參見 Wiki 教程:Jyhton,對於「實現 Python?」這句話感到疑惑的朋友可以參見 知乎:各種 Python 實現的簡單介绍與比較

此外,本篇對於 Sikulix 的參考主要來自於【測試】圖形化的自動測試 Sikuli / SikuliX 的相關技巧以及 Sikulix 圖形辨識自動化測試開發工具兩篇,特此感謝。

……

閱讀全文


我要訂便當 (2): 用 Python + Sqlite 儲存訂單

前情回顧:上一集在 我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單 中,我們藉由自動化套件 Selenium 控制 Chrome 成功從訂便當網站裡取得訂單資訊了。但只能夠取得現在的訂單,和原本有新訂單的時候才通知的目標仍然有點差距,那麼,如何判斷有沒有新訂單呢?只要和上一次讀取時的訂單相比就能知道了。

目標:將訂單儲存起來,判斷有沒有新訂單。

這一篇主要的做法主要參考自 大數軟體 - 如何透過 Line 發送最新一集的漫畫 中,關於如何判斷是否有最新一集漫畫的部分。這系列的影片步驟明瞭,說明直接,同時標題也很對我胃口(我就喜歡把工具拿來生活周遭玩的感覺),因此這邊也推薦一下,有興趣的可以去看看。

回歸正題,這篇的第一部分就是要使用 Sqlite 將抓到的訂單儲存起來。Sqlite 顧名思義就是 SQL + Lite 的感覺,主打小巧輕便。它會將資料儲存在一個檔案中,並且支援精簡的 SQL 指令,可以說是相當方便。

在 Python 要對 Sqlite 做操作主要是藉由 sqlite3 這個包,因此在接下來的步驟前,請先安裝這個包。關於 Sqlite3 的基本操作,可以參閱 菜鳥教程的 SQLite - Python 教學。

……

閱讀全文


我要訂便當 (1): 用 Python + Selenium 控制瀏覽器取得訂單

前言:

這是參加六角鼠年全馬的第一篇,主要是希望能夠養成寫部落格的習慣。由於我本身並沒有主要技能,因此這次參賽文章會以我最近玩的玩具、使用的套件或是遇到的問題做紀錄。

希望能夠派上用場。

目標:使用 PythonSelenium 連線到訂便當網站,自動輸入帳號密碼登入後,取回網站上的訂單資訊

(2020/12/4) 更新: 由於訂便當網站改版,所以程式碼已經不能照抄了。但有興趣的朋友還是能自己摸索做點變動,也能夠照常進行喔,加油~

最近在公司的時候有個莫大的煩惱,就是關於辦公室團購這回事兒。現在待著的公司主要是從 Dinbendon 這套系統來揪團購,舉凡品客、火鍋等都在上面訂過,據我觀察最受歡迎出現最多次的當屬雞排了。煩惱就在於,每次都會錯過雞排的團購,光在辦公室聞著四面八方傳來的雞排香味,就令人無法忍受!因此趁著這個機會,來嘗試能不能像之前的 PTT 一樣來弄出一個通知,順便玩玩最近看到的工具。這系列的文章會分成多個部分,主要是以使用的工具來分集。

由於在從團購網取得訂單的過程中需要跟網頁進行互動,因此這次要使用的工具是 Selenium

Selenium 是一個對網頁做自動化測試的工具,但我個人比較常在爬蟲的時候用到XD。它能夠經由腳本或錄製的方式對瀏覽器進行操作,並且也支援相當多語言可以使用,例如我同事便使用 C# 和 Hangfire 來完成訂便當的目標(對,這麼無聊的人不只我一個),而我則用相對比較熟悉的 Python 來實作。

……

閱讀全文


Python: 用爬蟲在 PTT 上監聽關鍵字並寄通知信

前陣子很想跟 Netflix 的團購,三不五時就上 PTT 看一下團購板,但看到的時候大多已經截止,還有填單填到一半發現已經收滿的,氣得七竅生煙。故嘗試寫了一個通知,在這邊記錄下來。

目標:當團購板上新發了一篇 Netflix 的文,馬上寄信告訴我。

為了這個目標,我們基本上需要:

  • 用爬蟲取得團購板的文章標題
  • 能夠寄信(使用 Gmail)
  • 持續監視,也就是重複執行
……

閱讀全文