輕鬆學習 Python:定時執行網站爬蟲

以 AWS EC2、crontab 與 SQLite 定時爬蟲並儲存

The world’s most valuable resource is no longer oil, but data.

The Economist

這個小節延續輕鬆學習 Python:透過 API 擷取網站資料輕鬆學習 Python:透過解析 HTML 擷取網站資料以及輕鬆學習 Python:透過操控瀏覽器擷取網站資料討論如何使用 Python、SQLite 資料庫與 crontab 排程工具將爬蟲程式部署到 AWS 的 EC2 元件上定時執行並儲存以便後續的資料分析應用與分享。


撰寫一個爬蟲程式,使用 requestsbeautifulsoup4 套件擷取並解析 Yahoo!奇摩股市-上市成交價排行Yahoo!奇摩股市-上櫃成交價排行的資料,再利用 pandas 套件將解析後的資料整併成一個外觀為 200 x 8 的資料框。

## (200, 8)
整併成一個外觀為 200 x 8 的資料框(前五列)
整併成一個外觀為 200 x 8 的資料框(後五列)

AWS(Amazon Web Services)亞馬遜雲端運算服務是由亞馬遜(Amazon.com)公司所建立的雲端運算平台,從 2002 年開始提供網站及客戶端的服務;EC2 (Elastic Compute Cloud)是一種網站服務,可在雲端提供安全、可調整大小的運算容量,旨在降低開發人員進行網站規模化的難度。透過下列 7 個步驟可以建立 AWS EC2:

  1. 前往 AWS.com 註冊一組帳號並登入
  2. 選擇 EC2
  3. 點選 Launch Instance
  4. 在 Choose AMI 的選項中從有 Free-tier eligible 標籤的映像檔入門,我們選擇 Ubuntu Server 作為範例
  5. 從 Choose Instance Type 到 Review 等選項均可以採用預設設定,一直點選下一步即可
  6. 在 Review 點選 Launch 之後跳出的對話框選擇 Create a new key pair、為金鑰命名並點選 Download Key Pair 下載金鑰
  7. 點選 Launch Instance,EC2 創建完成
選擇 EC2
在 Choose AMI 的選項中從有 Free-tier eligible 標籤的映像檔入門
點選 Download Key Pair 將金鑰下載

完成 EC2 創建之後稍等一段時間,就可以前往 EC2 儀表板,點選 Running Instances,準備連結 EC2。

點選 Running Instances

選擇剛才創建好的 EC2 並按下 Connect 獲得連線資訊。

獲得連線資訊

從連線資訊中我們得知要跟 EC2 連結有四個步驟:

  1. Windows 使用者要下載 PuTTY 作為 SSH(Secured Shell)客戶端;macOS 與 Linux 使用者開啟 Terminal 應用程式作為 SSH 客戶端
  2. 將下載的金鑰放置在熟悉的路徑
  3. chmod 指令將金鑰的使用權限設定為 400,僅擁有者可以讀取該檔案
  4. ssh -i 指令搭配金鑰與 EC2 的 Public DNS 連線
ssh -i 指令搭配金鑰與 EC2 的 Public DNS 連線

接著在 EC2 上安裝 Miniconda,一個輕量化版本的 Anaconda,這可以讓我們輕鬆將在本機可以順利運作的 Python 爬蟲程式部署到 EC2 上執行;首先用 wget 指令下載 Miniconda 的安裝檔(Miniconda3-latest-Linux-x86_64.sh)、再以 bash 指令進行安裝,安裝過程依序會有詢問是否同意授權(yes)、安裝路徑(按 enter 採預設)以及是否要執行 conda init (yes)。

## --2019-06-09 05:08:58--  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
## Resolving repo.anaconda.com (repo.anaconda.com)... 104.16.131.3, 104.16.130.3, 2606:4700::6810:8203, ...
## Connecting to repo.anaconda.com (repo.anaconda.com)|104.16.131.3|:443... connected.
## HTTP request sent, awaiting response... 200 OK
## Length: 70348401 (67M) [application/x-sh]
## Saving to: ‘Miniconda3-latest-Linux-x86_64.sh’
##
## Miniconda3-latest-L 100%[===================>] 67.09M 91.8MB/s in 0.7s
##
## 2019-06-09 05:08:58 (91.8 MB/s) - ‘Miniconda3-latest-Linux-x86_64.sh’ saved [70348401/70348401]
## Do you accept the license terms? [yes|no]
## [no] >>> yes
## Miniconda3 will now be installed into this location:
## /home/ubuntu/miniconda3
##
## - Press ENTER to confirm the location
## - Press CTRL-C to abort the installation
## - Or specify a different location below
##
## [/home/ubuntu/miniconda3] >>>
## Do you wish the installer to initialize Miniconda3
## by running conda init? [yes|no]
## [no] >>> yes

安裝結束後,以 exit 指令離開 EC2,接著再以 ssh -i 指令重新連線,這時再以 which python 檢視可以發現系統已經改以 Miniconda 的 Python 作為預設。

## /home/ubuntu/miniconda3/bin/python

為了能夠讓 EC2 順利執行爬蟲程式,我們要安裝程式所使用的 Site-Packages:requestsbeautifulsoup4pandas

Downloading and Extracting Packages
mkl_fft-1.0.12 | 172 KB | ################################### | 100%
intel-openmp-2019.4 | 876 KB | ################################### | 100%
openssl-1.1.1c | 3.8 MB | ################################### | 100%
numpy-base-1.16.4 | 4.4 MB | ################################### | 100%
mkl_random-1.0.2 | 405 KB | ################################### | 100%
python-dateutil-2.8. | 281 KB | ################################### | 100%
blas-1.0 | 6 KB | ################################### | 100%
libgfortran-ng-7.3.0 | 1.3 MB | ################################### | 100%
mkl-2019.4 | 204.1 MB | ################################### | 100%
beautifulsoup4-4.7.1 | 143 KB | ################################### | 100%
requests-2.22.0 | 89 KB | ################################### | 100%
pandas-0.24.2 | 11.1 MB | ################################### | 100%
numpy-1.16.4 | 49 KB | ################################### | 100%
soupsieve-1.8 | 104 KB | ################################### | 100%
pytz-2019.1 | 236 KB | ################################### | 100%
ca-certificates-2019 | 133 KB | ################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

EC2 的環境已經準備妥當,在開始定期執行之前還有兩件事情要做:

  • 微調一些爬蟲程式:增加把資料框寫入 SQLite 資料庫的程式
  • 調整 EC2 的時區:將預設的 UTC+0 時區調整為台灣台北時間(UTC/GMT +8)

使用資料框的 to.sql() 方法可以寫入指定的資料庫表格,參數 if_exists=’append’ 設定當表格存在時以添加觀測值的方式更新。

接著以 timedatectl 指令檢查目前 EC2 的時區。

##                       Local time: Sun 2019-06-09 06:54:02 UTC
## Universal time: Sun 2019-06-09 06:54:02 UTC
## RTC time: Sun 2019-06-09 06:54:03
## Time zone: Etc/UTC (UTC, +0000)
## System clock synchronized: yes
## systemd-timesyncd.service active: yes
## RTC in local TZ: no

預設的時區是 UTC+0,是倫敦格林尼治時間;調整為台灣台北時間(UTC/GMT+8)只要安裝 tzdata 套件,在互動安裝的過程中選擇亞洲、台北時區。

安裝完成以後再執行 timedatectl 指令檢查目前 EC2 的時區。

##                       Local time: Sun 2019-06-09 15:01:01 CST
## Universal time: Sun 2019-06-09 07:01:01 UTC
## RTC time: Sun 2019-06-09 07:01:02
## Time zone: Asia/Taipei (CST, +0800)
## System clock synchronized: yes
## systemd-timesyncd.service active: yes
## RTC in local TZ: no

使用任何一種 FTP 軟體把爬蟲程式(命名為 price_rank_scraper.py)上傳至 EC2 的家目錄下 /home/ubuntu

我們希望這支爬蟲程式在每天的 9:30 到 16:30 之間每小時都執行一次,可以 crontab -e 指令在定時執行的程式中加入:

30 9-16 * * * /home/ubuntu/miniconda3/bin/python /home/ubuntu/price_rank_scraper.py

在這個小節中我們簡介如何以 Python 的 requestsbeautifulsoup4 套件擷取網頁資料;pandassqlite3 套件寫入 SQLite 資料庫,並且整合成為一個爬蟲程式;最後建立了一個 AWS EC2 元件透過 crontab 來定時執行這個爬蟲程式。


DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

郭耀仁 Yao-Jen Kuo

Written by

Could that data be any tidier? It is always nice to meet a data enthusiast / 2:43 marathon runner.

DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade