python | 爬蟲筆記(二)- 爬蟲基礎

2.1 HTTP原理

一、URI、URL
統一資源標識符,統一資源定位符
協議+路徑+資源名稱
URL 是 URI 的子集,URI 還包括一個子類叫作 URN,它的全稱爲 Universal Resource Name,即統一資源名稱。
URN 只命名資源而不指定如何定位資源,如 urn:isbn:0451450523,它指定了一本書的 ISBN,能夠惟一標識這一本書,可是沒有指定到哪裏定位這本書,
 
二、超文本 Hypertext
html裏有一系列標籤,瀏覽器解析這些標籤後便造成了咱們日常看到的網頁,而這網頁的源代碼 HTML 就能夠稱做超文本。
 
三、HTTP、HTTPS
協議類型;
HTTP 的全稱是 Hyper Text Transfer Protocol,中文名叫作超文本傳輸協議,HTTP 協議是用於從網絡傳輸超文本數據到本地瀏覽器的傳送協議,它能保證傳送高效而準確地傳送超文本文檔。
HTTPS 的全稱是 Hyper Text Transfer Protocol over Secure Socket Layer,是以安全爲目標的 HTTP 通道,簡單講是 HTTP 的安全版,即 HTTP 下加入 SSL 層,簡稱爲 HTTPS。
 
SSL
- 創建信息安全通道,保證數據傳輸安全;
- 確認網站真實性,能夠經過鎖頭確認真實信息;
 
四、HTTP請求過程
瀏覽器-檢查-network 能夠查看整個請求和返回過程
五、Request
由客戶端向服務端發出。分爲Request Method、Request URL、Request Headers、Request Body,即請求方式、請求連接、請求頭、請求體。
 
· Request Method
請求方式,請求方式常見的有兩種類型,GET 和 POST。
GET:輸入網址加回車,URL中包含請求參數的信息;
POST:多爲表單提交發起,如用戶名密碼登錄,數據以Form Data即表單形式傳輸,不會體如今URL中,會包含在 Request Body 中。
GET 方式請求提交的數據最多隻有 1024 字節,而 POST 方式沒有限制。
因此如登陸(包含敏感信息)和文件上傳時,會用POST。
其餘方法
 
· Request URL
請求的網址
 
· Request Headers
請求頭,用來講明服務器要使用的附加信息,比較重要的信息有 Cookie、Referer、User-Agent 等
 
 
Request Headers 是 Request 等重要組成部分,在寫爬蟲的時候大部分狀況都須要設定 Request Headers。
 
· Request Body
即請求體,通常承載的內容是 POST 請求中的 Form Data,即表單數據,而對於 GET 請求 Request Body 則爲空。
在登陸以前咱們填寫了用戶名和密碼信息,提交時就這些內容就會以 Form Data 的形式提交給服務器,此時注意 Request Headers 中指定了 Content-Type 爲 application/x-www-form-urlencoded,此時才能夠以Form Data形式提交
 
 在爬蟲中若是咱們要構造 POST 請求須要注意這幾種 Content-Type,瞭解各類請求庫的各個參數設置時使用的是哪一種 Content-Type,否則可能會致使 POST 提交後得不到正常的 Response。
 
六、Response
由服務端返回給客戶端。Response 能夠劃分爲三部分,Response Status Code、Response Headers、Response Body。
 
· Response Status Code
響應狀態碼,此狀態碼錶示了服務器的響應狀態,如 200 則表明服務器正常響應,301表明跳轉,404 則表明頁面未找到,500 則表明服務器內部發生錯誤。
 
· Response headers
內容類型,內容長度,服務器信息,設置cookie等
 
· Resposne Body
響應體,最重要的內容。響應的正文數據都是在響應體中,如請求一個網頁,它的響應體就是網頁的 HTML 代碼,請求一張圖片,它的響應體就是圖片的二進制數據。
在作爬蟲時主要解析的內容就是 Resposne Body,經過 Resposne Body 咱們能夠獲得網頁的源代碼、Json 數據等等,而後從中作相應內容的提取。
 

2.2 Web網頁基礎

一、網頁組成
網頁能夠分爲三大部分,HTML、CSS、JavaScript,HTML 定義了網頁的內容和結構,CSS 描述了網頁的佈局,JavaScript 定義了網頁的行爲。
· HTML
網頁包括文字、按鈕、圖片、視頻等各類複雜的元素,其基礎架構就是 HTML。不一樣文件用不一樣標籤標示,而元素之間又經過div嵌套組合而成。
· CSS
層疊樣式表
「層疊」是指當在 HTML 中引用了數個樣式文件,而且樣式發生衝突時,瀏覽器能依據層疊順序處理。「樣式」指網頁中文字大小、顏色、元素間距、排列等格式。
CSS是目前惟一的網頁頁面排版樣式標準
結構:CSS選擇器+樣式規則
在網頁中,通常會統必定義整個網頁的樣式規則,寫入到 CSS 文件,其後綴名爲 css,在 HTML 中只須要用 link 標籤便可引入寫好的 CSS 文件,這樣整個頁面就會變得美觀優雅。
 · JavaScript
實現了一種實時、動態、交互的頁面功能。JavaScript 一般也是以單獨的文件形式加載的,後綴名爲 js,在 HTML 中經過 script 標籤便可引入。
二、網頁結構
 
 
一個網頁標準形式都是 html 標籤內嵌套 head 和 body 標籤,head 內定義網頁的配置和引用,body 內定義網頁的正文。
 
三、節點及節點關係
在 HTML 中,全部標籤訂義的內容都是節點,它們構成了一個 HTML DOM 樹。
DOM,英文全稱 Document Object Model,即文檔對象模型。它定義了訪問 HTML 和 XML 文檔的標準:
W3C 文檔對象模型 (DOM) 是中立於平臺和語言的接口,它容許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。
 
W3C DOM 標準被分爲 3 個不一樣的部分:
- 核心 DOM - 針對任何結構化文檔的標準模型
- XML DOM - 針對 XML 文檔的標準模型
- HTML DOM - 針對 HTML 文檔的標準模型
 
根據 W3C 的 HTML DOM 標準,HTML 文檔中的全部內容都是節點:
- 整個文檔是一個文檔節點
- 每一個 HTML 元素是元素節點
- HTML 元素內的文本是文本節點
- 每一個 HTML 屬性是屬性節點
- 註釋是註釋節點
 
 
經過 HTML DOM,樹中的全部節點都可經過 JavaScript 進行訪問,全部 HTML 節點元素都可被修改,也能夠被建立或刪除。
節點樹中的節點彼此擁有層級關係。咱們經常使用 parent(父)、child(子)和 sibling(兄弟)等術語用於描述這些關係。父節點擁有子節點,同級的子節點被稱爲兄弟節點。
 
            節點樹及節點關係
 
四、選擇器
CSS 選擇器會根據不一樣的節點設置不一樣的樣式規則
 
例如上例中有個 div 節點的 id 爲 container,那麼咱們就能夠用 CSS 選擇器表示爲 #container,# 開頭表明選擇 id,其後緊跟 id 的名稱。
另外若是咱們想選擇 class 爲 wrapper 的節點,即可以使用 .wrapper,. 開頭表明選擇 class,其後緊跟 class 的名稱。
另外還有一種選擇方式是根據標籤名篩選,例如咱們想選擇二級標題,直接用 h2 便可選擇。如上是最經常使用的三種選擇表示,分別是根據 id、class、標籤名篩選,請牢記它們的寫法。
 
另外 CSS 選擇器還支持嵌套選擇,各個選擇器之間加上空格分隔開即可以表明嵌套關係,如 #container .wrapper p 則表明選擇 id 爲 container 內部的 class 爲 wrapper 內部的 p 節點。
若是不加空格則表明並列關係,如 div#container .wrapper p.text 表明選擇 id 爲 container 的 div 節點內部的 class 爲 wrapper 節點內部的 class 爲 text 的 p 節點
還有一種比較經常使用的選擇器是 XPath

2.3 爬蟲基本原理

節點比做網頁,連線比做網頁之間鏈接關係。蜘蛛將整個網爬行到,抓取網站數據
 
一、爬蟲概述
爬蟲就是獲取網頁並提取和保存信息的自動化程序。
· 獲取網頁
網頁源代碼包含網頁部分有用信息
最關鍵的部分就是構造一個 Request 併發送給服務器,而後接收到 Response 並將其解析出來
 
Python 裏面提供了許多庫來幫助咱們實現這個操做,如 Urllib、Requests 等,咱們能夠用這些庫來幫助咱們實現 HTTP 請求操做,Request 和 Response 均可以用類庫提供的數據結構來表示,獲得 Response 以後只須要解析數據結構中的 Body 部分便可。
· 提取信息
最通用的方法即是採用正則表達式提取,但比較複雜,容易出錯
還有一些根據網頁節點屬性、CSS 選擇器或 XPath 來提取網頁信息的庫,如 BeautifulSoup、PyQuery、LXML 等,使用這些庫能夠高效快速地從中提取網頁信息,如節點的屬性、文本值等內容。
提取信息使雜亂的數據變得清晰有條理,方便後續分析
· 保存數據
txt文本或json文本;數據庫;或遠程服務器
 
二、能爬怎樣的數據
HTML 代碼,Json 字符串
二進制數據,如圖片、視頻、音頻等
各類擴展名的文件,如 CSS、JavaScript、配置文件等等
以上的內容其實都對應着各自的URL,是基於 HTTP 或 HTTPS 協議的,只要是這種數據爬蟲均可以進行抓取。
 
三、JavaScript渲染頁面
html多爲空殼,網頁被js渲染。用基本 HTTP 請求庫獲得的結果源代碼可能跟瀏覽器中的頁面源代碼不太同樣。可以使用 Selenium、Splash 這樣的庫來實現模擬 JavaScript 渲染

2.4 Session和Cookies

一、靜態網頁和動態網頁
HTML 代碼編寫的,文字、圖片等內容均是經過寫好的 HTML 代碼來指定的,這種頁面叫作靜態網頁。
動態網頁應運而生,它能夠動態解析 URL 中參數的變化,關聯數據庫並動態地呈現不一樣的頁面內容。而是可能由 JSP、PHP、Python 等語言編寫的。
動態網頁可實現用戶登陸註冊的功能,憑證
 
二、無狀態HTTP
缺乏狀態記錄,再次請求須要重複操做。
爲了節約資源,保持HTTP鏈接狀態, Session 和 Cookies出現。
Session 在服務端,也就是網站的服務器,用來保存用戶的會話信息,Cookies 在客戶端,也能夠理解爲瀏覽器端,有了 Cookies,瀏覽器在下次訪問網頁時會自動附帶上它發送給服務器,服務器經過識別 Cookies 並鑑定出是哪一個用戶,而後再判斷用戶是不是登陸狀態,而後返回對應的 Response。cookie保存了登陸憑證。
 
在爬蟲中,有時候處理須要登陸才能訪問的頁面時,咱們通常會直接將登陸成功後獲取的 Cookies 放在 Request Headers 裏面直接請求,而沒必要從新模擬登陸。
 
三、Session 會話
是指善始善終的一系列動做/消息。
在 Web 中 Session 對象用來存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。
 
四、Cookies
某些網站爲了辨別用戶身份、進行 Session 跟蹤而儲存在用戶本地終端上的數據。
 
· 會話保持
客戶端第一次請求服務器,服務器會返回一個Headers中帶有Set-Cookies字段的Response給客戶端,用來標記用戶,客戶端保存。下次請求時,瀏覽器會把此Cookies 放到 Request Headers 一塊兒提交給服務器,Cookies 攜帶了 Session ID 信息,服務器檢查該 Cookies 便可找到對應的 Session 是什麼,而後再判斷 Session 來以此來辨認用戶狀態。
有效則保持登錄,無效或過時則從新登陸
 
· 屬性結構
name
value
max age: 失效時間
path
domain
size
http
secure
 
· 會話Cookie、持久Cookie
會話 Cookie 就是把 Cookie 放在瀏覽器內存裏,瀏覽器在關閉以後該 Cookie 即失效,持久 Cookie 則會保存到客戶端的硬盤中,下次還能夠繼續使用,用於長久保持用戶登陸狀態。
 
五、常見誤區
關閉瀏覽器,服務器不會知道,所以也須要爲服務器設置一個失效時間

2.5 代理基本原理

服務器檢測的是某個 IP 單位時間的請求次數
設置代理,假裝IP
一、基本原理
代理服務器, Proxy Server 代理網絡用戶去取得網絡信息。
request和response都經過代理服務器進行中轉
 
二、代理做用
突破自身 IP 訪問限制
提升訪問速度
方位一些單位或團體內部資源
隱藏真實ip
 
三、代理分類
 
  
根據匿名程度區分:
· 高度匿名
· 普通匿名
· 透明匿名
...
 
四、常見代理設置
免費、付費、ADSL撥號
 

##本系列內容爲《python3爬蟲開發實戰》學習筆記。本系列博客列表以下:css

(零)學習路線html

(一)開發環境配置python

(二)爬蟲基礎正則表達式

(三)基本庫使用數據庫

(四)解析庫使用json

(五)數據存儲瀏覽器

(六)Ajax數據爬取安全

(七)動態渲染頁面爬取Selenium服務器

持續更新...cookie

對應代碼請見:..

相關文章
相關標籤/搜索