【Python 網路爬蟲筆記】Introduction - part 1

感謝你點進本篇文章!!我是 LukeTseng,一個熱愛資訊的無名創作者,由於近期大學開設大數據分析程式設計這門課程,裡面談到了爬蟲概念,讓我激起一些興趣,因而製作本系列筆記。

聲明:本篇筆記僅供個人學習用途,斟酌參考。

何謂網路爬蟲(Web Crawler)?

spider

Image Source:https://www.freepik.com/free-vector/cute-spider-sticker-white-background_20770625.htm#fromView=keyword&page=1&position=48&uuid=58458110-a248-4037-895d-b6b66f71a92b&query=Spider+cartoon

網路爬蟲(Web Crawler),也叫網路蜘蛛,是一種用來自動瀏覽全球資訊網的網路機器人。其目的一般為編纂網路索引。
From WikiPedia

網路爬蟲最主要的用處是可以「自動化」幫我們擷取及收集想要的資訊。

一般的 Web 網站上都是以 HTML 結構化網站,內部也有一些 CSS Selector,透過網路爬蟲可以去解析 HTML 跟 CSS 來幫我們找到想要的資訊,找到的資訊可以存放在 .csv 或是 data base 當中。

不是只有擷取資料就叫網路爬蟲

網路爬蟲是一個自動化的程式,能模擬人類瀏覽網頁的行為,系統性的去存取網站並擷取資料。

如果具有結構性的資料已現存在網路上的話,又或是有 API 可以存取資料,這些我們都不需要動用到網路爬蟲,因為直接取得就好了。

網路爬蟲的應用

  • 抓取 ptt 上某個分類的留言、瀏覽量等。
  • 抓取電商網站上的價格,假設有特價,低於原價時會用某種方式通知。
  • 股票資訊收集(股價、月報、財報等),加上大數據分析去追蹤股價趨勢。
  • Google Bot(Google Search Console 那個自動化程式,可以拿來檢查網頁情況)
  • SEO 優化
  • AI 訓練、資料科學(可做為機器學習資料集的建構)

網路爬蟲的種類

靜態網頁(靜態爬蟲)

要在靜態網頁上執行爬蟲程式相對簡單,因為這種類型的網站只要完成一個 Request 跟 Response 之後,Client(客戶端)跟 Server(伺服端)就不會有任何的交流了。

所有的互動都只與瀏覽器的網頁互動,資訊不會傳遞到後端伺服器。
From steam.oxxostudio.tw

特性:

  • HTML 內容可直接使用(不需額外的 JS 執行來加載或修改內容)
  • 簡單方便執行(不需處理 Client 邏輯或動態內容)
  • 速度較快(因為內容已寫死在 HTML 裡面,爬蟲程式可以直接對它去做解析)

哪些網站是靜態網頁的?

  • Wikipedia
  • 公司官網的產品介紹頁
  • 新聞網站發布的文章

可能用到的 Python 模組:

  • Beautiful Soup
  • lxml

動態網頁(動態爬蟲)

相對的,若要在動態網頁上執行爬蟲程式,就會相對複雜。動態網頁會依據 user 行為不斷去跟 server 做交流。

它(動態網頁)會因為變數的改變而產生不同的網頁。這既可能是伺服器端生成的網頁,也可能是使用者端生成的網頁,或是兩者的混合。
From WikiPedia

常見用於動態網頁的語言有:

  • PHP
  • ASP

等等這些。

特性:

  • 需處理 JS(需等待 JS 執行完才能獲得完整內容)
  • 需模擬 user 互動(可能需要點擊、滾動、輸入等操作來觸發內容載入)
  • 速度慢且雜(需額外的瀏覽器引擎或工具來處理動態內容)

哪些網頁是動態網頁?

  • Facebook、Instagram 的動態消息(需要登入和滾動載入)
  • Google Map 的地圖資料(需縮放跟拖曳)
  • 電商網站的商品搜尋結果(需搜尋關鍵字)

可能用到的 Python 模組:

  • Selenium

一覽表

分類靜態網頁(靜態爬蟲)動態網頁(動態爬蟲)
定義一次 Request/Response 後就不再與伺服器交互,內容直接寫死在 HTML 中。依據使用者行為不斷與伺服器交互,內容會因變數或操作而動態產生。
引用所有的互動都只與瀏覽器的網頁互動,資訊不會傳遞到後端伺服器。它(動態網頁)會因為變數的改變而產生不同的網頁。
特性- HTML 內容可直接使用
- 簡單方便執行
- 速度較快
- 需處理 JS
- 需模擬 user 互動
- 速度慢且雜
常見網站- Wikipedia
- 公司官網產品介紹頁
- 新聞文章
- Facebook、Instagram 動態消息
- Google Map
- 電商網站搜尋結果
常見技術/語言- HTML 為主- PHP
- ASP 等
Python 模組- Beautiful Soup
- lxml
- Selenium

用爬蟲可以,但切勿觸法!

著作權法部分,網路上任何文字、圖片內容都受著作權法保障(著作權法第十條:著作人於著作完成時享有著作權。但本法另有規定者,從其規定)

若未經過作者同意使用,則不能直接使用。(若未取得授權直接使用可能觸犯著作權法第九十一條)

再來是刑法的部分,若爬蟲做到以下這些事情的話:

  1. 繞過網站的防禦機制。
  2. 無故取得、刪除或變更目標網站資料。
  3. 使用了超越應有的權限資料。
  4. 爬取資料未設定適當延遲,可能被當成 DDos 攻擊。

可能會觸犯刑法上的第三百五十八至三百六十條。

刑法第 358 條:
無故輸入他人帳號密碼、破解使用電腦之保護措施或利用電腦系統之漏洞,而入侵他人之電腦或其相關設備者,處三年以下有期徒刑、拘役或科或併科三十萬元以下罰金。

刑法第 359 條:
無故取得、刪除或變更他人電腦或其相關設備之電磁紀錄,致生損害於公眾或他人者,處五年以下有期徒刑、拘役或科或併科六十萬元以下罰金。

刑法第 360 條:
無故以電腦程式或其他電磁方式干擾他人電腦或其相關設備,致生損害於公眾或他人者,處三年以下有期徒刑、拘役或科或併科三十萬元以下罰金。

最後也要留意網站上 robot.txt 的規範,什麼是 robot.txt?robots.txt 是網站與爬蟲之間的約定,位於網站根目錄下。

robot.txt 通常會寫允許什麼樣的 User-Agent 訪問,以及 Crawl-delay (爬取資料延遲)訪問間隔時間。

如果網站有提供 API,那就優先使用 API 就好了,因為 API 不僅效率更高,也避免了許多法律和技術問題。

認識 HTTP

為什麼要認識 HTTP?因為我們要在做爬蟲應用之前,認識一下網路的基本概論是很重要的事情,不然到時候用 Python 的 Request 模組會不清楚裡面運作原理到底是幹嘛的。

HTTP 協定

HTTP Request and Response

Image Source:https://hackmd.io/@Huei/HkfFHq0g_

上面是一張 HTTP Request 與 Response 的簡圖。

首先來認識什麼是 HTTP 協定,HTTP 英文全名為 HyperText Transfer Protocol,翻中的話就是「超文本傳輸協定」。

是一種用於分佈式、協作式和超媒體訊息系統的應用層協定。HTTP是全球資訊網的數據通訊的基礎。
From WikiPedia

HTTP 簡單來說可以看作是電腦與電腦間的溝通方式,用於在網路上傳輸網頁、圖片、影片等資源的應用層協定。每當我們在瀏覽器中打開網頁時,背後就是透過 HTTP 協定在運作。

它被設計來讓瀏覽器和伺服器進行溝通,但也可做其他用途。

HTTP 採用 Client-Server 模型(也稱為主從式架構:Client/Server Architect),如同上圖,運作方式基於「請求與回應」(Request/Response)的架構:

  1. Client 發送請求(Requests):如當在瀏覽器中輸入網址並按下 Enter,瀏覽器會向託管網站的 Server 發送 HTTP 請求。
  2. Server 處理回應(Responses):Server 收到 Response 後,會回傳狀態碼(Status Code)(如 “HTTP/1.1 200 OK”)以及 Requests 的內容,如 HTML 檔案、圖片或錯誤訊息等。
  3. 預設通訊埠(Port):HTTP 通常使用 TCP 協定,預設在 80 埠進行通訊。

Client 發送 Requests 的情境也不一定是輸入網址按下 Enter,也可能是在購物網站上按下訂單按鈕後,向 Server 發送 Requests,總之就是 HTTP 無所不在。

Request Method

HTTP Request Method 主要告訴 Server 想要幹嘛,如同在餐廳的櫃檯前明確告訴服務生,要點菜?還是結帳之類的。

也如有個 HTTP Request Method 是 GET,表示要告訴 Server 端說要獲取某些資料。

常見的 HTTP 方法有:

  • GET:從 Server 檢索資料(如載入網頁)。
  • POST:向 Server 發送資料以創建新資源(如提交表單)。
  • PUT:更新伺服器上的現有資源。
  • DELETE:從伺服器中刪除資源。
  • HEAD:僅檢索回應的標頭,不檢索實際資料。
  • PATCH:部分更新現有資源。

Request URL

URL 英文全名為 Uniform Resource Locator,翻中為統一資源定位符(或稱統一資源定位器、定位位址、URL位址),簡單來說就是網址啦。

Request URL 指的是 HTTP Request 中 Client 希望存取的 Server 上具體資源的路徑位置。它告訴 Server 「你想要什麼資源」,如同在圖書館中告訴圖書館員你要借哪本書一樣。

以下的 HTTP Request 中的第二個 /index.html 就是 Request URL。

1
GET /index.html HTTP/1.1

補充一下 URL 的完整格式:

1
[協定]://[伺服器位置]:[連接埠號碼]/[檔案路徑]

http://www.example.com:3000/home 為例:

  • 協定(Protocol):http - 指定使用的通訊協定。
  • 主機(Host):www.example.com - 伺服器的網域名稱或 IP 位址。
  • 通訊埠(Port):3000 - 連接埠號碼(HTTP 預設 80,HTTPS 預設 443)。
  • 路徑(Path):/home - 伺服器上的資源路徑。

Request URL 的組成要素

  1. 路徑(Path)

指定伺服器上檔案或資源的具體位置,如 /products/list/api/users

  1. 查詢字串(Query Strings)

用於傳遞額外參數給伺服器,格式為 ?參數1=值1&參數2=值2

1
http://www.example.com/search?keyword=手機&price=1000
  • ? 是查詢字串的開始符號。
  • & 用來分隔不同的參數。
  • keyword=手機price=1000 是具體的參數。

HTTP 標頭(Header)

HTTP 通訊協定是用 HTTP 標頭(HTTP Header)在客戶端跟伺服端之間交換瀏覽器、請求資源和 Web 伺服器等相關資訊,這是 HTTP 通訊協定溝通訊息的核心內容。
From 《Python 網路爬蟲與資料視覺化應用實務》章節 2 - 1 - 1(HTTP 標頭)第 2-2 頁

另外 Headers 就只是一對鍵值對 key : value。

HTTP Headers 大致上分成四種:

  • 一般標頭(General Headers):
    • 適用於請求和回應的通用資訊,如 Connection(控制連線是否保持)、Cache-Control、Date(訊息產生的時間)。
  • 請求標頭(Request Headers):
    • 包含請求資源或 Client 的資訊,如 Host(目標伺服器的網域名稱)、User-Agent(客戶端軟體身份識別)、Accept(客戶端能接受的內容類型)、Authorization(身份驗證資訊)。
  • 回應標頭(Response Headers):
    • 包含回應的資訊,如 Server(伺服器軟體資訊)、Set-Cookie(設定 Cookie 值)、Location(重新導向的目標位置)。
  • 實體標頭(Entity Headers):
    • 描述訊息主體的資訊,如 Content-Type(內容的 MIME 類型)、Content-Length(內容長度)、Content-Encoding(內容編碼方式)。

如何檢視 HTTP 標頭

以本文作者網站作為示例:https://luketsengtw.github.io

在任意處按下右鍵 -> 檢查,可開啟開發人員工具。

Open Debug UI

或是直接按下 F12 即可跳出右邊欄的東東:

Using F12 to open Debug UI

接下來前往 【Network】,再刷新網頁(按下 F5)或在上面 Reload page 也可以:

Network Reload page

重刷完後上面記得選擇 All。

instruction one

接下來滑鼠左鍵點擊 luketsengtw.github.io 這個檔案:

instruction two

然後就會跳出如下圖右方紅框處出現的 HTTP 標頭了!

result of HTTP Headers

General Headers 的內容

從圖中可以看到 General Headers 的內容大致如下:

1
2
3
4
Request URL: https://luketsengtw.github.io/
Request Method: GET
Status Code: 200 OK (from service worker)
Referrer Policy: strict-origin-when-cross-origin

基本上就是顯示一般的資訊啦,像是什麼網址、Request Method、Status Code 顯示請求成功等等。

Response 可看到 Server 回傳的內容

當我們進入一個網址後,要在本地端看到網頁,就需要透過 Server 回傳 html 給我們才能看到。

如下圖,當按下 Response 選項,即可看到伺服器回傳的 HTML 語言:

see the HTML language

總結

網路爬蟲(Web Crawler)是一種自動化的程式,可以模擬人類瀏覽網頁的行為,系統性地存取並擷取網站上的資訊,常用於自動化收集結構化資料如 HTML 中的內容。爬蟲有靜態與動態兩種形式,分別用於不同類型的網頁。

簡要定義

網路爬蟲(Web Crawler):自動瀏覽和抓取網頁資料的機器人程式,用於資料擷取與收集。

用途:自動化擷取網頁內容後,存到資料庫或 CSV 用於後續分析。

應用範例:

  • 抓取PTT文章留言與瀏覽數
  • 電商價格監控與特價通知
  • 股票資訊數據收集及分析
  • Google Bot 網站爬取與SEO優化
  • 機器學習資料集建構

靜態爬蟲 vs 動態爬蟲

分類靜態網頁(靜態爬蟲)動態網頁(動態爬蟲)
定義一次 Request/Response 後就不再與伺服器交互,內容直接寫死在 HTML 中。依據使用者行為不斷與伺服器交互,內容會因變數或操作而動態產生。
引用所有的互動都只與瀏覽器的網頁互動,資訊不會傳遞到後端伺服器。它(動態網頁)會因為變數的改變而產生不同的網頁。
特性- HTML 內容可直接使用
- 簡單方便執行
- 速度較快
- 需處理 JS
- 需模擬 user 互動
- 速度慢且雜
常見網站- Wikipedia
- 公司官網產品介紹頁
- 新聞文章
- Facebook、Instagram 動態消息
- Google Map
- 電商網站搜尋結果
常見技術/語言- HTML 為主- PHP
- ASP 等
Python 模組- Beautiful Soup
- lxml
- Selenium

基本HTTP認識

  • HTTP (HyperText Transfer Protocol)是「超文本傳輸協定」,負責瀏覽器和伺服器間的溝通。
  • 運作基於 Client-Server 模型(主從式架構),透過 Request(請求)和 Response(回應)交互傳輸資料。
  • 常用 Request 方法:GET(抓取資料)、POST(送出資料)、PUT、DELETE 等。
  • Request URL 指明要請求的資源位置,包括協定、主機、埠號、路徑與查詢字串。

HTTP Header 分類

  • General Headers:通用資訊,如 Connection、Date
  • Request Headers:客戶端資料,如 Host、User-Agent、Accept
  • Response Headers:伺服器回應資訊,如 Server、Set-Cookie
  • Entity Headers:訊息內容描述,如 Content-Type, Content-Length

如何檢視HTTP標頭

  1. 【右鍵點選網頁 → 檢查】或【按 F12 叫出開發者工具】
  2. 選擇 【Network】標籤,重新載入頁面。
  3. 點擊欲查看的網頁請求項目,即可見 Request 與 Response 的 Header 及內容。

Reference

參考書籍《Python 網路爬蟲與資料視覺化應用實務》章節 1 - 3(網路爬蟲的概念)第 1-10 頁。

參考書籍《Python 網路爬蟲與資料視覺化應用實務》章節 2 - 1 - 1(HTTP 標頭)第 2-2 頁。

關於網路爬蟲 - Python 教學 | STEAM 教育學習網

網路爬蟲 - 維基百科,自由的百科全書

網路爬蟲是什麼 | 網路蜘蛛如何運作? | Cloudflare

網路爬蟲如何操控你的SEO排名?關鍵原理與應用一次看懂 - 玩構科技

網路爬蟲入門 - HackMD

[Day3]靜態網頁與動態網頁爬蟲 | iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

用爬蟲爬取網路上的資料違法嗎?使用公開資訊要小心!天矽科技網頁設計

爬蟲軟體法律風險全解析:著作權、個資、合約與競爭法的界線在哪裡? - 李明勳律師

著作權法§10-全國法規資料庫

著作權法§91-全國法規資料庫

中華民國刑法§358-全國法規資料庫

中華民國刑法§359-全國法規資料庫

中華民國刑法§360-全國法規資料庫

超文本傳輸協定 - 維基百科,自由的百科全書

[Day08] 天天上網看到的HTTP是甚麼? Web開發初學者必學!!! | iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

Client Request, Server Response - HackMD

HTTP headers 簡介: 一些常用的headers | HoMuChen

網路概論3: HTTP - App 開發基礎