網路爬蟲學習分享

Ron
·
(edited)
·
IPFS
·

前言

在這個資訊爆炸的時代中,網路上的資料成為現代人的資訊來源,因此網路上的資料收集可以說是現代人必備技能之一,但是透過人工的方式來收集大量的網路資料,效率不高之外還會花費過多的時間,這個時候如果有一個方便的工具可以替代人工的方式,想必會變得非常輕鬆,因此資料的收集與整理,可以透過網路爬蟲來協助,可以自行制定好程式腳本的規則,網路爬蟲就可以自動依照規則收集和存取資料。

這篇文章主要會分享透過 Python 程式語言,進行網路資料存取的基本程式撰寫, 希望對於不熟悉或是沒寫過的朋友們有所幫助。

網路爬蟲的介紹

網路爬蟲(web crawler),也稱網路蜘蛛(spider),是使用腳本來自動瀏覽網站資訊的技術。

最成功的應用無非就是網路搜尋引擎,像是 Google、Yahoo、Bing,它們透過網路爬蟲在網際網路中收集各式各樣的網站與內容,當用戶在搜尋引擎上搜尋關鍵字時,就能夠找出相關的網站資訊。

網路爬蟲的存取過程會消耗目標網站的系統資源。不少網路系統並不默許網路爬蟲,因此在存取大量頁面時,網路爬蟲需要考慮到規劃與負載。不願意被網路爬蟲存取的公開網站可以使用 robots.txt 檔案來要求網路爬蟲只對網站的一部分進行索引,或完全不作處理。


開發實作環境

  • Python 3.9.2
    https://www.python.org/downloads/release/python-392/
  • pip 20.2.3
    為 Python 內建的套件管理。
  • Python Requests 套件
    可對網路發起 HTTP 協定的各式請求,像是 get、post、delete 等。
  • Python Beautifulsoup4 套件
    藉由網頁的結構特性來解析網頁,可透過指令提取 HTML 標籤裡的元素。
  • Python lxml 套件
    用於解析 XML 和 HTML 文件資料的工具,並且可將數據轉換為 Python 數據類型。

開發實作方式

第一步:收集網路爬蟲相關資料

在存取所需要的內容前,需要先了解 HTML 的結構,以及要存取的資料是在哪個 element 中,可以透過 F12 的方式開啟 Chrome 的開發者工具,藉由網頁的 HTML 原始碼查找所要的資料 element,也可以在想要存取的資料上按 右鍵 → 檢查,或是透過 command/control + shift + c 查找。

Photo on VIESHOW

可以看到 class 為 infoArea 的 section 標籤(白色框) 裡包含了一部電影資訊,電影名稱(紅色框)、英文名稱(橘色框)、上映日期(黃色框),取得所需的資料 element 後,就可以開始撰寫網路爬蟲的程式腳本來抓取資料了。

第二步:撰寫網路爬蟲程式腳本

import requests
from bs4 import BeautifulSoup

response = requests.get('https://www.vscinemas.com.tw/vsweb/film/coming.aspx?p=1')
soup = BeautifulSoup(response.text, 'lxml')

首先先透過 import 來匯入 requests 與 BeautifulSoup 套件。

接者使用 requests.get 方法,發出我們要進行網路爬蟲的網站 url 請求,來取得即將上映的網頁資料。

成功得到回覆後,在 response.text 中可以取得 HTML 網頁內容,在建立 BeautifulSoup 物件,使用 lxml 的解析方法,接著就可以解析網頁的內容並擷取所需的資料了。

info_items = soup.find_all('section', 'infoArea')
for item in info_items:
    zh_name = item.h2.text.strip()
    en_name = item.h3.text.strip()
    time = item.time.text.strip()
    print('{}({}),上映日:{}'.format(zh_name, en_name, time))

透過 soup.find_all 找出在網頁中所有 class 為 infoArea 的 section 標籤,來取得每一部電影資料,它會回傳一個 list,所以需要透過 for 迴圈來 find 各別取出每一部電影中的以下三個資訊,並使用 print 來印出結果。

  • 電影名稱(zh_name):
    h2 的標籤,透過 text 取得字串後在使用 strip() 刪除多餘的空白。
  • 英文名稱(en_name):
    h3 的標籤,透過 text 取得字串後在使用 strip() 刪除多餘的空白。
  • 上映日期(time):
    time 的標籤,透過 text 取得字串後在使用 strip() 刪除多餘的空白。

第三步:執行程式腳本驗證結果

完成後執行該網路爬蟲程式腳本,即可看到如下的執行結果。

完成後的網路爬蟲程式腳本會像下面這樣。

import requests
from bs4 import BeautifulSoup

response = requests.get('https://www.vscinemas.com.tw/vsweb/film/coming.aspx?p=1')
soup = BeautifulSoup(response.text, 'lxml')
info_items = soup.find_all('section', 'infoArea')
for item in info_items:
    zh_name = item.h2.text.strip()
    en_name = item.h3.text.strip()
    time = item.time.text.strip()
    print('{}({}),上映日:{}'.format(zh_name, en_name, time))

結尾

以上是藉由 威秀影城即將上映 的資料來進行基礎的網路爬蟲實作範例,也一同附上了網路爬蟲的程式腳本,如果覺得這篇文章寫得還不錯或是對你有幫助的話,希望可以不吝嗇的給小弟五個鼓掌。

如果還有其他問題,或是有其他想要了解的技術主題,也可以直接留言喔~

參考文獻

相關網站

相關文章

CC BY-NC-ND 2.0

Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!