Sunday, July 1, 2018

PHP連結資料庫以及存放表格規劃

繼續影音網站的自動化....

前面有兩篇提到網址, 網頁都要整理出 pattern , 既然要整理, 就需要有存放資料的地方, 以便撈取.

而整理 pattern 時, 由於需要跨時間與跨不同網站或不同網頁比較, 所以使用資料庫來存放是比較合適的作法.

因為授權關係, PHP 常搭配 mariaDB (由 MySQL 發展出來), 而連線的方式通常有兩種:
1. mysqli : 是由 mysql 改良而來, 傳統 mysql 可能會遇到 SQL Injection 等攻擊, mysqli 提供了"預存結構法", 確保查詢指令與查詢資料是分開的, 而 SQL Injection 就會單純當資料而不容易攻擊.
2. PDO : 由於大部分關聯式資料庫都遵循 ANSI SQL , 基本的挑選(select), 更新(update)功能都是相同的, 但各資料庫服務的語法仍有些許不同, 所以 PHP 提供 PDO 方式, 在 PHP 內保持語法一致, 讓開發者假如跨不同資料庫, 語法不用重寫, 只有剛開始的連線指令不同.

假如是 XAMPP 環境, 基本上就已經裝好 Apache + PHP 擴充 + mariaDB , PHP 程式內寫入連線語法即可, 不過還沒開始用程式分析 pattern , 就先規劃資料表.

學資料庫一定會學到正規化, 不過學正規化跟實作上還是有差別, 主要是實作時, 有些業務上雖然不同, 但規格上是相同的資料, 其實可以放在一起, 舉兩個例子:
1. 為民服務有專案, 群, 服務三層項目, 剛學資料庫可能就會拆三個表, 不過實際上可以用同一張表, 多加一個欄位: 屬於第幾層, 然後再用 view 或程式內篩選.
2. 影音網站是收集 URL , 可是 URL 有包括: a. 由使用者輸入的第一批, b. 依使用者輸入, 實際連線時, 網站會回傳的. c. 根據網站回傳的 URL , 分析 pattern 後, 產生"純"的 URL .

網頁內容因為要分析 pattern 中哪些 div 相同哪些不同, 所以要在不同時間抓取多次來比較, 基本上 div 不同的地方就很可能是廣告, 可以排除, 至於網站內容是否也要產生"純"的網頁內容來當快取, 暫時還沒有想到, 先用 timestamp 多存幾次就好.

這樣基本上就有兩個資料表: 1. URL 2. 網頁內容 ; 而 URL 目前有兩類: a. 使用者輸入 b. 連結時, 網站回傳的 URL , 所以有幾欄: 1. 這個 URL 屬於那一類 2. URL 3. URL 序號 4. URL 是否對應其他序號(假如使用者輸入與網站回傳的 URL 不同時), 5. 抓取的時間  ; 網頁內容則只有 3 欄: 1. 是對應 URL 的序號, 2. 是抓取的時間, 3. 是存放抓取的網頁內容.

這樣的結構, 在 PHP 基本上就有兩個事情:
1. 使用者輸入 URL , 記錄下來.
2. 用 cURL 去抓看看, 然後把抓到的結果存起來.
pattern 分析才開始準備....