【Python 】爬蟲小撇步

NTU Data Analytics Club
NTU Data Analytics Club
7 min readJul 10, 2022

你是否於爬蟲時遇到以下問題:想要一次爬取多頁、網站需要不斷往下滑才會出現新資訊、或是好不容易爬下網頁資訊,卻出現大串無法理解的亂碼?NTUDAC 的課程長品儒於是精心設計了一個 Workshop,帶領社員了解基礎爬蟲概念、網頁架構、以及進階爬蟲技巧。

【Python】爬蟲workshop. 在這資訊爆炸的時代,我們可以使用在網路上的大量資訊,但為了找到特定資料,你是否經… | by NTU Data Analytics Club 一文中介紹基礎爬蟲概念以及實作,而本篇會更聚焦於爬蟲的網頁架構,以及三種進行網頁爬蟲時常見的困難,和這些困難的解方,話不多說,趕緊看下去吧!

Key Takeaways

  1. 網頁由許多 HTML 元素組成,元素又可大致拆分為標籤、屬性、內容
  2. 模擬真人瀏覽動態網頁的動作可達成動態網頁爬蟲
  3. 利用 for 迴圈執行網指換頁規律可達成換頁爬蟲
  4. 加入 Request Headers 資訊可反反爬蟲機制

網頁架構 ft. HTML

  • 學習爬蟲為甚麼要理解網頁架構呢?因為進行網頁爬蟲時,我們會需要打開網頁原始碼,搜尋我們想要爬取的資訊在原始碼裡的代碼為何,再用程式碼執行爬取動作。而這邊要介紹的原始碼就是 HTML。你現在正在閱讀的網頁,也是由眾多 HTML 檔案所構成的唷!
  • 那甚麼是 HTML 呢?HTML 是超文本標記語言(Hyper Text Markup Language)的縮寫,雖然看起來像是程式語言,但其實是標記語言(markup language),使用標記標籤來告訴瀏覽器該如何呈現網頁。
  • HTML 由許多元素組成,元素又由標籤、屬性、內容所組成,我們以「 <a href=”https://ntudac.com”> 台大資料分析與決策社 </a>」這個元素為例
  1. 標籤:告訴我們該元素的位置與功能,<a> 就是這個元素的標籤,表示「超連結」。大部分的標籤為成對標籤,即元素頭尾皆須放置標籤,尾部的標籤會多加上 “ / “,例如頁首的尾部標籤就會變成 </a>;少數標籤為獨立標籤,例如<br> (分行)。下圖是一些常見的標籤。

2. 屬性:告訴我們該標籤的額外資訊,包含標籤的格式/運作方式等。例如屬性 “href” 常會接在超連結標籤 “a” 後方,預告著超連結網址的出現,因此從 <a href=”https://ntudac.com”> 能得知,我們在網頁中點下這個 HTML 元素所顯示的東西,就會導到 https://ntudac.com。下圖是一些常見的元素。

3. 內容:就是實際在網頁中會顯示的內容,例如我們於 HTML 內容區塊看到的「台大資料分析與決策社」這幾個字下,也是實際上會於網頁上閱讀到的。

動態網頁

  • 有些網站不總是死板板的呈現固定內容,而是會根據使用者行為(滾動頁面、等待五秒就能略過廣告等),給與對應的互動,這就是動態網頁。此時,我們需要對原本抓取靜態網頁的爬蟲程式碼進行微調,模擬真人瀏覽動態網頁的行為。以下我們將介紹如何爬取「將頁面往下滾動便會出現新資訊」的動態網頁。
  • 動態網頁爬蟲步驟
  1. import 三個套件: selenium(可以直接驅動瀏覽器,也就是模擬一般使用者瀏覽網頁的習性)、webdriver(用來控制瀏覽器的行為)、BeautifulSoup(用來解析 HTML 內容,方便取得網頁內資料)

2. 取得網頁原本網址

本網址為 104 求職網

3. 模擬真人往下滑動瀏覽器:以下案例運用 for 迴圈將網頁向下滾動 30 次,而這個過程中出現的資訊就可以想像成是靜態網頁

4. 利用靜態爬蟲方法獲取資訊

換頁爬蟲

  • 當我們寫了一串爬蟲程式碼時,通常代表我們懶得手動瀏覽網頁資訊,因此經常會需要爬取不只一頁的網頁資訊。這時候就需要觀察不同頁的網址規律,運用 for 迴圈執行換頁爬蟲。
  • 換頁爬蟲步驟
  1. import selenium、webdriver、 BeautifulSoup
  2. 取得網址,並觀察不同頁之網址規律:以蝦皮商品頁為例,每頁有 60 個商品,因此商品頁每多加一頁,橘色部分就會 +60

3. 用 for loop 改變每頁網址

4. 於每個迴圈內利用靜態爬蟲方法獲取資訊

反反爬蟲

  • 有時費盡心力中於爬下網頁資料,卻發現內容有如天書般難懂,這是因為某些網站為了保護自身資訊,或是避免伺服器負擔過大,會加入「反爬蟲」機制。這個機制經常會根據網站瀏覽來源的更多資訊(例如 Headers、User Agents、Cookies)來判斷,因此我們便須在爬蟲程式碼中加入這些資訊來騙過反爬蟲網站。反爬蟲方式有許多種,包含透過 headers 判斷、加入使用者行為判斷模擬真實用戶登入授權等,此處方式為針對「透過 headers 判斷」的反爬蟲網頁
  • 反反爬蟲步驟
  1. import selenium、webdriver、BeautifulSoup
  2. 取得真正的網址:叫出網頁原始碼(按右鍵點選「檢查」,或是 Windows 可直接按 fn + f12),1) 從 Network 中 2)3) 找到實際含有所需資訊的請求(Name 區塊每個條目都是一項請求),此例中即為商品名稱(將 items 點開後可看到商品名稱,則 ”search_items?by=relevancy&…” 就是我們要的請求,可以適時運用 ctrl + F 加快搜尋速度),4) 點擊 Headers,5) Request URL 後方的網址為我們相要爬取商品資訊之網址

3. 取得 Request Headers 資訊並:於 Request URL 頁面往下滑就可找到。不過由於 Request Headers 資訊極多,而反爬蟲網站可能只辨認其中幾項來確認發出網頁請求者是否為真人,因此此處需要採用試誤法,將對的 Request Headers 資訊貼入程式碼才能真正騙過反爬蟲網站

以蝦皮爬蟲而言,我們會額外需要提供 cookie 這項才能繞過反爬蟲機制。cookie 存取了使用者紀錄或偏好等資訊,而我們只要在爬蟲時指名”cookie”後面對應的這串代碼,就能成功反反爬蟲。此程式碼中額外提供 user agent 資訊,減少試誤次數,因為提供的 Request Headers 資訊越完整,繞過反爬蟲機制的成功率越高。

4. 利用靜態爬蟲方法獲取資訊

感謝品儒帶領社員了解爬蟲原理,以及各種常見爬蟲問題的解決方式,搭配 【Python】爬蟲workshop. 在這資訊爆炸的時代,我們可以使用在網路上的大量資訊,但為了找到特定資料,你是否經… | by NTU Data Analytics Club 一同使用,便可掌握基礎爬蟲、正規表達式、真實用戶登入授權、換頁爬蟲、動態網站、反反爬蟲等技巧!

歡迎各位拍手交流,NTUDAC 也會持續在 MediumFacebook LinkedIn 更新社課資訊,歡迎對資料分析有興趣的大家持續關注,跟我們交流想法!

--

--

NTU Data Analytics Club
NTU Data Analytics Club

臺大資料分析與決策社 (NTUDAC) 為一群對資料科學抱有熱忱的臺大學生創立, 旨在教授學員如何利用數據分析解決商業問題的商業性社團,在 Medium 將分享社團課程與實作專案內容,以期推廣資料分析的相關資訊。