Python 爬蟲筆記

工欲善其事,必先利其器

Gordon Fang
8 min readMay 27, 2019

初探網路爬蟲

是一種針對網頁、網站的自動擷取資料技術,可以透過它自動蒐集我們所想要的資料。網際網路中有千萬萬的資料,我們窮極一生也無法閱讀完,你想要或許不僅僅是簡單的資訊,而是一個經由資料處理過,分析,整理的訊息,網路爬蟲正是我們想要的。

可以為我們做什麼?

  • 在社群網站得到使用者評價、流行話題、趨勢。
  • 在股票網站取得股市資訊,追蹤估價趨勢,進而投資
  • 取得對手網站商品價格,進而比較,調整自身價格
  • 取得當前最新上映電影資訊、評價、上映廳院
  • 獲取飯店、機票價錢,建立比較資訊
  • 追蹤房地產趨勢

建立爬蟲程式步驟

  1. 鎖定目標網址
Uniform Resource Locator(URL)

2. 向目標網址發送HTTP請求封包,取得HTML網頁原始碼

html request, and response packets

3. 分析HTML網頁: 使用瀏覽器開發人員工具,快速找到標籤,分析出資料的所在。

google chrome developer tool

4. 剖析HTML網頁: 使用剖析器建立樹狀結構標籤集合

html tree structure

5. 擷取資料: 利用走訪方式擷取資料,儲存成特定格式

網路爬蟲技術

HTTP協定(Hyper Text Transmission Protocol)

一般來說,我們瀏覽網頁都是打開瀏覽器,輸入關鍵字找到我們要拜訪的網頁,而網路爬蟲是模擬人拜訪網站。

如果你有認真看過網頁上的網址你會發現上頭都幾乎是HTTP開頭,HTTP是一種網路協定,專門傳送多媒體資料,網路爬蟲就是向那些網站傳送HTTP請求封包,然後當遠端的伺服器收到我們的資料時,會回傳我們所需要的資料。

上述HTTP協定傳送過程就是一個主從架構(主機對上終端使用者),使用者輸入網址後,連到遠端伺服器,要求與伺服器建立連線,伺服器應允,使用者電腦會傳送請求封包,最後伺服器會傳送我們一般所看到的網頁資料。

HTTP通訊過程:

  1. 終端向伺服器發送建立連線封包
  2. 伺服器應允
  3. 終端向伺服器發送請求封包,要求指定檔案
  4. 伺服器回應終端訊息,傳送其指定檔案

定位網頁資料

  1. CSS 選擇器(CSS Selector): 顧名思義就是選擇我們定義 CSS 的位置,進而定位網頁資料所在。
程式範例#1
soup.select("div.release_movie_name > a.gabtn")
soup.select("div.release_movie_name > div.en > a.gabtn")soup.select("div.release_movie_time")soup.select("div.release_movie_name dd > div.leveltext > span.count")

2. 正規化表達(Regular Expression): 正規表式使用單個字串來描述、符合一系列符合某個句法規則的字串,比對出我們想要的資料,例如:電話號碼、金額、電子郵件地址等。

3. Xpath 表達(Xpath Expression): HTML標籤語言網頁結構本身就是樹狀結構,結構中有許多的節點、子節點,是一種用來尋找XML文件中某個節點(node)位置的查詢語言, 使用類似路徑的語法來尋找節點,Xpath 表達也適用於HMTL標籤語言,也就說我們可以使用Xpath找出指定標籤。

程式範例#2
<bookstore>
<book>
<title>中醫芳療百科:150種精油╳8大體質,調理改善策略</title>
<author>沈莉莎, 李嘉菱</author>
<publication_date>2019/05/17</publication_date>
<price>537</price>
</book>
</bookstore>

儲存資料

一般我們分析、蒐集完資料後,我可以將資料存成結構化的資料,可以存成以下的檔案格式

  1. JSON
  2. CSV
  3. XLSX
  4. SQL

爬蟲工具

  1. Requests模組

此模組是我們用來與網頁伺服器進行HTTP通訊、建立HTTP請求的工具,這樣我們才能取得網頁原始碼內容,此外還可以存取API,下載XML、JSON檔案。

程式範例#3
# 下載安裝 Python 3 的 requests 模組

pip3 install requests2
# 導入 requests 模組
import requests

# 使用 GET 方法下載網頁資料
r = requests.get('https://www.google.com.tw/')
# 伺服器回應代碼
print(r.status_code)

2. Beautiful Soup模組

Beautiful Soup 是一個 Python 的函式庫模組,可以快速解析HTML/XML,並產生Beautiful Soup的物件,這個物件包含整個標籤語言的樹狀結構,有了這個結構,我們就可以使用像是CSS選擇器,擷取我們想的資料。

程式範例#4# 下載安裝 Python 3 的 requests 模組
pip3 install BeautifulSoup
# 導入 BeautifulSoup 模組
from bs4 import BeautifulSoup
html_str = "<p>Hello World</p>"
# BeautifulSoup是html網頁剖析器,可將html標籤轉成Python物件樹
# BeautifulSoup 三種解析器 lxml, html5lib, html.parser(built-in)
soup = BeautifulSoup(html_str, "lxml")
Int[9]: print(soup)<html><body><p>Hello World</p></body></html>

3. Selenium模組

上述都還是在靜態網頁範疇,也就是網頁本身的架構是標籤搭配資料內容,但有些是利用網頁腳本語言JavaScript產生出來的資料,Beautiful Soup變成無法處理這一類的網頁。

Selenium模組能夠操作控制瀏覽器,使用python語言與HTML表單進行互動,更可以取得動態網頁的資料。

4. Scrapy模組

Scrapy模組是一套網路爬蟲框架,可以管理HTTP封包請求、Session、輸出入管道,剖析網頁內容。

網絡抓取規則

  1. 網路爬蟲法律責任: 網頁內容歸屬,爬蟲前請先仔細閱讀網站使用條文,是否能合法使用他們的資料,若用在商業用途,可能會遭致法律風險。
  2. 避免過度訪問: 網路爬蟲程式頻繁訪度網頁伺服器,有可能導致伺服器過度負載,因為伺服器默認接收人類訪問,為避免此狀況發生, 對單一個網站每秒進行一次請求會比較好。
  3. 網頁更新: 網站布局會隨著時間而改變,所以若要保持資料擷取正確,還是要隨時拜訪網站,觀看結構是否有無變化。

參考

附範例與完整程式碼!手把手帶著你用 Python 做出爬蟲、抓取網頁資料

Python 使用 Beautiful Soup 抓取與解析網頁資料,開發網路爬蟲教學

Python:網路爬蟲與資料視覺化應用實務

--

--

Gordon Fang
Gordon Fang

Written by Gordon Fang

Hi 我是 Gordon,目前是自然語言實驗室的研究生,曾經是金融業軟體工程師,我對大語言模型、設計模式、Linux、平面設計都有涉略,歡迎相互交流。

Responses (1)