在上一集的 將 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 資料庫系統 說明得相當詳細。

這邊簡述一下操作過程(當然,還是建議進入上面推薦的網頁直接照圖操作)

首先,先進到專案的頁面,選擇 Resources 分頁並往下到 Add-on,擴充套件基本上都從這裡開始安裝,事實上遇到的許多問題都會到這裡用擴充套件解決。在此就先輸入 Postgres 並安裝 Heroku Postgres,並且選擇免費方案。

安裝完畢之後,可以點選 Heroku Postgres 進入擴充套件管理的頁面,這邊進去 Setting 就可以進行相關的設定,也能從這邊取得帳號、密碼及資料庫URL。

Heroku 部分設定完畢之後,就要回來改我們便當的程式碼。相對於當初 SQLite 時使用的 sqlite3 包,這次要操作 PostgreSQL 則是要使用 python-psycopg2 這個包。

相關的操作可以參考 Gitbook.net 的這篇 PostgreSQL 連接 Python。可以發現整體的操作方式和之前使用 sqlite3 並沒有什麼太大的不同,因此略做修改之後就可以使用囉。

本區段的參考資料

二、在 Heroku 上執行 Selenium

前面的 我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單 中,能取得訂單內容主要都是依賴於 Selenium 控 chrome 上。然而我們丟上 Heroku 後… 哪來的瀏覽器啊!因此遭遇到了這整個專案最大的存在危機(?)

幸好後來有找到這篇 Running ChromeDriver with Python Selenium on Heroku,裡面有說明如何順利在 Heroku 上跑 Selenium,實在是相當感謝,這邊也記錄一下。

我們在前面 我要訂便當(4-1) —— 將 Python 腳本部署上 Heroku 有提到,Heroku 有建置包這東西來協助建置專案,也提到 Python 是 heroku-buildpack-python。這邊就是建置包去建出 webdriver,因此使用 heroku buildpacks:add 的指令去加入 heroku-buildpack-chromedriver heroku buildpa 這個建置包。

加入完畢之後,要設定 heroku 的 config 去指定 chrome 和 chrome driver 的路徑

heroku config:set GOOGLE_CHROME_BIN=/app/.apt/usr/bin/google_chrome
heroku config:set CHROMEDRIVER_PATH=/app/.chromedriver/bin/chromedriver

最後只要修改程式就可以囉,一樣先指定好路徑

GOOGLE_CHROME_PATH = '/app/.apt/usr/bin/google_chrome'
CHROMEDRIVER_PATH = '/app/.chromedriver/bin/chromedriver'

並且在設定 selenium 的部份加上一些 chrome 的參數

chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.binary_location = GOOGLE_CHROME_PATH

在初始化 webdriver.Chrome 一併傳入就可以囉!說起來之前 chrome 被我改壞時,也是靠 -no-sandbox 才開起來的,關於 sandbox ,可以看 Google 的 這篇漫畫,或是這篇 Inside 的簡單介紹

本區段的參考資料

結語

訂便當系列到這邊也告一段落了。事實上到了中後期,為了配合公司環境已經把爬蟲放在公司跑,並改成拿去接公司指定的通訊軟體,Line notify 這邊就比較少繼續碰了。中間遇到的一些問題也是有空加減解的程度,因此暫時沒有繼續更新訂便當的打算了。

但 Heroku 實在是挺方便,之後應該還是會嘗試把其他東西丟上來跑看看,也因此還是覺得要把這些小問題記錄下來,之後如果遇到別的相關問題,也比較方便集中起來,因此就有了這兩篇的紀錄。

那麼本週就到這裡,之後還會找新的坑來跳,畢竟菜雞就是不斷地踩坑嘛!感謝收看~

我要訂便當系列