iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

資料蒐集與分散式運算 30 天系列 第 9

[Day 9] 動態爬蟲 - 1

觀迎來到第九天,今天要進入動態網站爬蟲。首先要先理解什麼是動態網站?又和靜態網站之間有什麼差異?

靜態網站與動態網站的差異

靜態網站與動態網站的差異亦可以理解為同步與非同步,靜態網站再完成一個請求與回應後,客戶端即不再與伺服器有任何的交流,而動態網站則不同,當客戶端完成第一次請求後,會透過非同步的方式依照使用者的行為不斷的與伺服器進行交流。我們可以簡單地從觀察 URL 的方式去粗略的解讀該網站是否為動態網站,以 IT 邦幫忙為例,每一篇文章都有一個相對應的 URL,因此不管是在你的電腦上輸入該網址,或者在你朋友的電腦上輸入該網址,你們所看到的內容皆相同。而動態網站呢?在同樣的 URL 底下會依照使用者的行為有不同的內容,舉一個最簡單的例子 - Facebook,每個人的 Facebook 頁面的網址皆為 https://www.facebook.com/ ,但為什麼你開的頁面,跟你朋友開的頁面會不同呢?因為該頁面會透過非同步的方式不斷與伺服器進行溝通,以 Facebook 為例他的交流內容可能就是你的登入資訊,每個人的登入資訊不同,因此同樣都是 https://www.facebook.com/ ,但在瀏覽器上卻是截然不同的內容。

面對動態網站

面對動態網站時,我們可以透過模擬 XML 的請求方式得到所需資訊,例如 Silicon Jungles 這家知名的新加坡公司官網,我們會觀察到在官網輸入 ls 指令後會有一個 XML 請求的產生,並於官網顯示該網站的目次。

https://ithelp.ithome.com.tw/upload/images/20200922/20128931Slz87xjq24.png

https://ithelp.ithome.com.tw/upload/images/20200922/20128931c3yKooQQeK.png

因此我們可以透過 python 模擬這個請求得到我們需要的資訊,會發現得到的回應是一個 json 格式的資料,因此透過 response.json 進行解析得到了 about.txt <br> env.txt <br> jobs.txt <br> contact.txt 的資料,符合我們在官網上所看到的資訊。

import requests
url = "https://siliconjungles.com/terminal/ls"
response = requests.post(url,data={"cmd":"ls",})
print(response.json()['type'])
# about.txt <br> env.txt <br> jobs.txt <br> contact.txt

但通常動態網站不會只有單純一個 XML 的請求,甚至有許多是 Js 選染的結果,假如例如利用 request.get 訪問 https://google.com 會發現在 response 中完全找不到 "登入" 這個名字。因此我們需要透過 Selenium 進行動態網站的爬蟲,Selenium 的架構與邏輯如下

  • 透過 python selenium 模組控制 webdriver(瀏覽器)
  • 透過瀏覽器進行動態網站的渲染
  • 得到渲染後的 HTML 透過 HTML 解析模組(BeautifulSoup / lxml)進行解析

事前準備

  • 安裝 selenium 模組
pip install selenium
  • 安裝 webdriver (這裡以 Chrome 為例,請確認電腦所安裝的 Chrome 版本,並於官網中下載支援的 webdrvier)

小試身手

讓我們透過 Selenium 進行第一次的請求

from selenium import webdriver

driver = webdriver.Chrome(executable_path = "webdriver 的位置")
driver.get("http://www.google.com")
driver.close()

你會發現有一個全新的 Chrome 視窗跳出,並在成功地顯示出 Google 首頁!

我們將從明天開始正式爬取動態網站。明天見!


上一篇
[Day 8] 番外篇 - 工程師了生活就是這麼樸實無華 - 2
下一篇
[Day 10] 動態爬蟲 - 2
系列文
資料蒐集與分散式運算 30 天30

尚未有邦友留言

立即登入留言