我要訂便當 (5): Heroku 填坑小記
在上一集的 將 Python 腳本部署上 Heroku 中,記錄了將 Python 腳本放上 Heroku 的過程,但仍然沒有將我們的 訂便當小幫手 給放上去。之前有稍微提到是因為過程中遇到了一些問題,最後決定將這些問題和找到的前人解決文記錄在這一篇,將來再遇到的時候就可以參考。
- SQLite 要改成用 PostgreSQL
- 在 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 並沒有什麼太大的不同,因此略做修改之後就可以使用囉。
本區段的參考資料
- 佈署 Python Flask 網站留言板應用程式到 Heroku + PostgreSQL 資料庫系統
- [Ting’s筆記Day5] 在部署到Heroku之前,將Rails專案從SQLite設定為PostgreSQL - iT邦幫忙
- PostgreSQL 連接 Pytho - Gitbook
- SQLite on Heroku - Heroku Dev Center
二、在 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 的簡單介紹。
本區段的參考資料
- Running ChromeDriver with Python Selenium on Heroku - Michael Browne - Medium
- Heroku 上使用 webdriver 爬蟲抓資料 - Kevin的部落格
- Running ChromeDriver with Python selenium on Heroku - Stackoverflow
結語
訂便當系列到這邊也告一段落了。事實上到了中後期,為了配合公司環境已經把爬蟲放在公司跑,並改成拿去接公司指定的通訊軟體,Line notify 這邊就比較少繼續碰了。中間遇到的一些問題也是有空加減解的程度,因此暫時沒有繼續更新訂便當的打算了。
但 Heroku 實在是挺方便,之後應該還是會嘗試把其他東西丟上來跑看看,也因此還是覺得要把這些小問題記錄下來,之後如果遇到別的相關問題,也比較方便集中起來,因此就有了這兩篇的紀錄。
那麼本週就到這裡,之後還會找新的坑來跳,畢竟菜雞就是不斷地踩坑嘛!感謝收看~
我要訂便當系列
其他文章
哈囉,如果你也有 LikeCoin,也覺得我的文章有幫上忙的話,還請不吝給我拍拍手呦,謝謝~ ;)