【資料分析】Python爬蟲入門實作(下) — 動態網頁爬蟲、反反爬蟲、JSON 格式

Kao Jia
9 min readOct 22, 2023

--

目錄:
1. 動態網頁爬蟲
1.1 webdriver安裝
1.2 模擬手動滑動網頁
2. 反反爬蟲
2.1 網頁擋爬蟲的方式
2.2 反反爬蟲步驟
3. 補充:Json格式

動態網頁爬蟲

動態網頁與靜態網頁不同,它會隨著使用者的動作增加新的資訊,因此我們需要其他套件去模擬使用者做了哪些動作以取得特定資訊。這裡我們使用selenium:

#需要先安裝套件
pip install selenium

除了selenium 之外,我們也需要下載Webdriver,它是用來指名說我們要模擬的瀏覽器是哪種,如:Chrome, Safari

📍這裡需要注意的有兩點:

  1. chrome和chromedriver版本是否一致:電腦上的chrome版本若和下載下來的chromedriver版本不一致,可能會導致無法正常運行。若要查看chrome 瀏覽器的版本,可以網址的地方輸入:chrome://version/
    來查看瀏覽器版本 (如下圖,我的版本是116.0.5845.179)。

- 再來就是找chromedriver,下載同一個版本的chrome driver: https://chromedriver.chromium.org/downloads/version-selection

2. Mac是否有阻擋外來程式:可以去系統偏好設定>安全性與隱私權 這邊設定打開

記得將檔案放在目標資料夾:/usr/local/bin/之下喔(Mac快捷鍵:option+command+G)

以下就是使用selenium和webdriver來自動打開chrome瀏覽器網頁的語法(以google網頁為例):

# 載入需要的套件
from selenium import webdriver
# 開啟瀏覽器視窗(Chrome)
driver = webdriver.Chrome()
# 打開我們要的網址
driver.get("http://www.google.com")

模擬手動滑動網頁

那我們要如何解決動態網頁會因為卷軸滾動而產生新資料的問題呢?我們可以使用以下程式去模擬人類在上網時滾動滑鼠捲軸的動作。以下time.sleep代表每滾完要等0.5秒取等待瀏覽器給我們新資訊。

以下就是模擬我們打開ABC網頁,並一直用滑鼠往下滾的情況。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.ABC.com.tw/jobs/search/")
#執行卷軸滾動30次
import time
for x in range(1, 31):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(0.5)

結合這個語法與前面靜態網頁所提到的語法,我們就可以一次滾許多的網頁並獲得許多資料:

import requests
from bs4 import BeautifulSoup
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.ABC.com.tw/jobs/search/")
#執行卷軸滾動30次
for x in range(1, 6):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(0.5)
soup = BeautifulSoup(driver.page_source,"html.parser")
for job in soup.find(id="js-job-content").find_all(class_="b-list-inline b-clearfix"):
print(job.find('a').text)

反反爬蟲

反爬蟲是什麼?有些網頁會擋爬蟲、不想要讓他人取得大量網頁資訊,因此可能透過登入、驗證碼來增加爬蟲的阻礙。

網頁擋爬蟲的方式包含:

  1. 用headers來判斷:例如要求使用者提供cookies資訊、瀏覽器資訊等
  2. 加入使用者行為來模擬真實用戶登入的授權:像是會需要手動打勾,去確認你是真的人
  3. 驗證碼機制

因此本節將討論如何反反爬蟲:

反反爬蟲步驟:

  1. 取得正確網址
  2. 取得headers
  3. 在requests時納入以上資訊

我們這邊以DEF購物網站為例,我們今天想爬取購物網站「電腦包」的資訊:

import requests
from bs4 import BeautifulSoup
url = "https://www.DEF.com.tw/search/computer_bag
#取出網頁原始碼
resp=requests.get(url)
#將網頁資料透過不同的方法,擷取所需的資料,html parser代表以 html 的方式來解析
soup = BeautifulSoup(resp.text,"html.parser")

檢查soup 回傳的資訊,結果得到如下:

很明顯的我們發現結果與先前 ABC人力銀行爬蟲回傳的網頁不同,這裡並沒有得到整個html的網頁內容,因此我們合理的懷疑這個網站是有檔爬蟲的。
由於在瀏覽網站時,我們不需要登入帳號密碼,因此在這裡我們可以排除檔爬蟲的方法不是上述需要驗證碼或是需要登入的方式,而是在發送請求時需要更多的資訊,來讓網頁確認我們不是惡意機器人。

我們可以從網頁原始碼中的「Network」看到發送請求的所有紀錄,其中包含了以關鍵字為「電腦包」發送的請求,那我們要如何尋找這條請求呢?

我們先隨便點一個Network中的元素,再按下control+F (Mac: command+F)搜尋該網頁上任何一個品名,如這邊為搜尋「Samsonite」這個品牌,這時我們可以看到搜尋結果有兩個,一個以campaign 開頭的發送請求紀錄,一個以購物網站網址為開頭。因此我們知道以campaign開頭的這個紀錄就是我們要找的,因此我們在Network底下的fileter搜尋框中打campaign,這時就會出現我們要找的紀錄了!

接著我們需要取得User Agent,在右邊General資訊往下滑,就能看到 User Agent,我們將這個資訊擷取下來放入以下的程式碼 header 中:

import requests
from bs4 import BeautifulSoup
url = "https://www.DEF.com.tw/search/%E9%9B%BB%E8%85%A6%E5%8C%85/?m-id=RAD3c-CT-Computer-009"
#取出網頁原始碼
resp=requests.get(url, headers={"user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"})
#將網頁資料透過不同的方法,擷取所需的資料,html parser代表以 html 的方式來解析
soup = BeautifulSoup(resp.text,"html.parser")

由此我們就能看到結果與剛才有所不同,有回傳完整資訊了! 由此,我們就能繼續以前面所學的靜態網頁爬蟲技巧取得網頁資訊了。

補充:JSON格式

有些網站並非使用一般的HTML格式撰寫,而是使用其他格式。以DEF購物網站為例,我們可以看到在我們想要爬取的商品名和商品資訊是用 dictionary 來撰寫的(大括號&冒號),此時若用ABC人力銀行網站的爬取方式則會爬不出來,這時我們需要先解析 JSON格式。

soup
如在122行<script>之後的語法是由{ } 所包起來的,合理推測是由 JSON格式撰寫

我的作法是會先將 JSON 格式的部分複製下來另存新檔(.JSON)再由 python讀取:

import json
import pandas as pd
with open('./product_list.json') as f:
data=json.load(f)
df = pd.DataFrame(data)
name =df['name'][1:10]
price = []
len
for i in df['offers'][1:10]:
price.append(i['price'])
item_dict = {'產品名': name, '價格': price}
item=pd.DataFrame(item_dict)
item

稍微整理一下就能取得產品名與價格了!

以上我們就完成動態網頁爬蟲的初步概念了,爬蟲的細節非常多,唯有不斷練習才能精進這門技巧。隨著網頁的改版,我們也會需要去學習面對新問題的其他解法,若我有學習到新方法會再更新上來的。那麼下次再見囉!

對於Python其他應用有興趣的話,也可參考下列文章:

  1. 【資料分析】如何用Python執行SQL語法

2. 【資料分析】Python爬蟲入門實作 — 網頁架構、靜態網頁爬蟲

3.【資料分析】使用Python 抽換 Excel資料 — xlwings套件

--

--