使用Chrome開發者工具解析網站

使用Chrome開發者工具解析網站

前言

每個網站抓取的程式碼各不相同,不過背後的原理是相通的。對於絕大部分網站來說,抓取的套路就那麼一些。今天這篇文章不談任何具體網站的抓取,只來說一個共性的東西: 如何通過 Chrome 開發者工具尋找一個網站上特定資料的抓取方式。

大綱

了解網頁架構

HTML (HyperText Markup Language)

HTTP 標籤


標籤名稱用途
<h1> -<h6>標題
<p>段落
<a>超連結
<table>表格
<tr>表格內的row
<td>表格內的cell
<br/>換行(無結束標籤)

屬性名稱意義
class標籤的類別(可重複)
id標籤的id(不可重複)
title標籤的顯示資訊
style標籤的樣式
href超連結
data-*自行定義新的屬性

HTTP 協定

請求(request)& 回應(response) :  HTTP是一個用戶端終端(用戶)和伺服器端(網站)請求和回應的標準(TCP)。通過使用網頁瀏覽器、網路爬蟲或者其它的工具,用戶端發起一個HTTP請求到伺服器上指定埠(預設埠為80)。其中我們稱這個用戶端為用戶代理程式(user agent)。

檢視網頁原始碼 View Page Source

在網頁上右擊滑鼠,選擇 “檢視網頁原始碼”(View Page Source),就會在新標籤頁中顯示這個 URL 對應的 HTML 程式碼文字。以 TWSE 臺灣證券交易所 為例: 

此功能並不算是“開發者工具”一部分,但也很常用。這個內容和你直接通過程式碼向此 URL 傳送 GET 請求得到的結果是一樣的(不考慮許可權問題)。如果在這個原始碼頁面上可以搜尋到你要內容,則可以按照其規則,通過正則、bs4、xpath 等方式對文字中的資料進行提取。

Ctrl+F 快捷鍵 : 可以直接在網頁內容尋找您要的資料 ,例如,輸入  "市場公告"

不過,對於很多非同步載入資料的網站,從這個頁面上並不能搜到你要的東西。或者因為許可權、驗證等限制,程式碼中獲取到的結果和頁面顯示不一致。這些情況我們就需要更強大的開發者工具來幫忙了。

檢查(Inspect)

Elements

在網頁上右擊滑鼠,選擇“檢查”(Inspect)按鍵 F12 ,可進入 Chrome 開發者工具的元素選擇器 =>在工具中選擇 Elements 標籤頁。

Elements 有幾個功能: 

  • 選擇元素:通過滑鼠去選擇頁面上某個元素,並定位其在程式碼中的位置。 
  • 模擬器:模擬不同裝置的顯示效果,且可以模擬頻寬。 
  • 程式碼區:顯示頁面程式碼,以及選中元素對應的路徑
  • 樣式區:顯示選中元素所受的 CSS 樣式影響

從 Elements 工具裡定位資料比我們前面直接在原始碼中搜尋要方便,因為你可以清楚看到它所處的元素結構。但這邊特別提醒的是:

Elements 裡看到的程式碼不等於請求網址拿到的返回值。

它是網頁經過瀏覽器渲染後最終呈現出的效果,包含了非同步請求資料,以及瀏覽器自身對於程式碼的優化改動。所以,你並不能完全按照 Elements 裡顯示的結構來獲取元素,那樣的話很可能得不到正確的結果。

Styles

在Elements頁面標籤中 

  • => 1. 點選 "選取元素"的圖示
  • => 2. 在左側網頁顯示區處選區我們所要查看的網頁元件,例如 : 我們選取證交所的 Logo.
  • => 3. 該元件會在程式碼區出現反白,我們逐步展開,對比左側頁面,招出元件的HTML 標籤 Tag.
  • => 4. 選取功能 Styles樣式區
  • => 5. 此區塊會出現所有相關的CSS 樣式。


Computed

重複以上步驟1-3 

  • => 1. 選取功能 Computed 元件大小尺寸
  • => 2.  此區塊顯示元件大小尺寸


Event Listeners

重複以上步驟1-3

  • => 1. 選取功能 Event Listeners 網頁事件觸發 JavaScript 列表
  • => 2. 此區塊可以看到此元件相關的 JavaScript 事件觸發

若在上述2 中我點選任何一個 JavaScript ,可以自動進入 Sources 頁面標籤。在此,我們以 keyup 的 main.js 為例,按滑鼠左2下選擇,即會出現該JavaScript 的 Sources 頁面標籤

Network

在開發者工具裡選擇 Network 標籤頁就進入了網路監控功能,也就是常說的“抓包”。

這是爬蟲所用到的最重要功能。它主要解決兩個問題: 

  1. 抓什麼
  2. 怎麼抓

抓什麼

是指對於那些通過非同步請求獲取到的資料,如何找到其來源。  

開啟 Network 頁面,開啟記錄,然後重新整理頁面,就可以看到發出的所有請求,包括資料、JS、CSS、圖片、文件等等都會顯示其中。從 Request table 請求列表 中可以尋找你的目標。  

一個個去找會很痛苦。分享幾個小技巧:  

  • 點選搜尋Search功能,直接對內容進行查詢。 
  • 選中 Preseve log,這樣頁面重新整理和跳轉之後,列表不會清空。 
  • Filter 欄 可以按型別和關鍵字篩選請求。 
找到包含資料的請求之後,接下來就是用程式獲取資料。

這時就是第二個問題:怎麼抓

並不是所有 URL 都能直接通過 GET 獲取(相當於在瀏覽器裡開啟地址),通常還要考慮這幾樣東西:  

  • 請求方法,是 GET 還是 POST。 
  • 請求附帶的引數資料。GET 和 POST 傳遞引數的方法不一樣。 
  • Headers 資訊。常用的包括 user-agent、host、referer、cookie 等。其中 cookie 是用來識別請求者身份的關鍵資訊,對於需要登入的網站,這個值少不了。而另外幾項,也經常會被網站用來識別請求的合法性。同樣的請求,瀏覽器裡可以,程式裡不行,多半就是 Headers 資訊不正確。你可以從 Chrome 上把這些資訊照搬到程式裡,以此繞過對方的限制。 

Headers

點選 Request table 請求列表 列表中的一個具體請求,選擇 Headers 功能,上述資訊都可以找到。


Preview

點選 Request table 請求列表 列表中的一個具體請求,選擇 Preview 功能


找對請求,設對方法,傳對引數以及 Headers 資訊,大部分的網站上的資訊都可以搞定了。

Save as HAR with content

Network 還有個功能:點選 Request table 請求列表 列表中的一個具體請求,右鍵點選列表,選擇“Save as HAR with content”,儲存到檔案。這個檔案包含了列表中所有請求的各項引數及返回值資訊,以便你查詢分析。(實際操作中,我發現經常有直接搜尋無效的情況,只能儲存到檔案後搜尋)


其他功能

除了 Elements 和 Network,開發者工具中還有一些功能,比如: 

Sources,檢視資源列表和除錯 JS。 

Console,顯示頁面的報錯和輸出,並且可以執行 JS 程式碼。很多網站會在這裡放上招聘的彩蛋(自己多找些知名網站試試)。

但這些功能和爬蟲關係不大。如果你開發網站和優化網站速度,就需要和其他功能打交道。這裡就不多說了。  

結論

總結一下,其實你就記住這幾點:  

  1. 檢視網頁原始碼”裡能看到的資料,可以直接通過程式請求當前 URL 獲取。 
  2. Elements 裡的 HTML 程式碼不等於請求返回值,只能作為輔助。 
  3. Network 裡用內容關鍵字搜尋,或儲存成 HAR 檔案後搜尋,找到包含資料的實際請求。
  4. 檢視 請求 的具體資訊,包括方法、headers、引數,複製到程式裡使用。 
理解了這幾步,大部分網上的資料都可以拿到,說“解決一半的問題”。



參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • Web-Crawler,Data-Mining,Data-Science,htmlcss-web,Chrome

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組