1. 程式人生 > >《 Python3 網路爬蟲開發實戰》學習筆記1-爬蟲基礎

《 Python3 網路爬蟲開發實戰》學習筆記1-爬蟲基礎

本記錄將按照本人的學習程序,將學習過程中遇到的問題和重難點如實記錄下來,一個是鞏固自身所學,另一個也希望能對後來人有所幫助。

目錄(第1部分)

第1章開發環境配置

第2章爬蟲基礎

2.1 HTTP基本原理

2.1.1 URI和URL

2.1.2超文字

2.1.3 HTTP和HTTPS

2.1.4 HTTP請求過程

2.1.5請求

2.1.6響應

2.2網頁基礎

2.2.1網頁的組成

2.2.2網頁的結構

2.2.3節點樹及節點間的關係

2.2.4選擇器

2.3爬蟲的基本原理

2.3.1爬蟲概述

2.3.2能抓取怎樣的資料

2.4會話和餅乾

2.4.1靜態網頁和動態網頁

2.4.2無狀態HTTP

2.4.3常見誤區

2.5代理的基本原理

2.5.1基本原理

2.5.2代理的作用

2.5.3爬蟲代理

2.5.4代理分類

2.5.5常用代理設定


第1章開發環境配置

這裡不做過多的敘述,環境配置是每一個學習程式設計的人都應掌握的基本功,遇到的時候自行百度即可,如果有書的同學也可看書解決,書中寫得很詳細了。

第2章爬蟲基礎

這章是本節筆記的重點內容,包括以下內容:

其中HTTP相關內容可以參考我另一篇計算機網路相關的部落格

2.1 HTTP基本原理

2.1.1 URI和URL

URI:Uniform Resource Identifiers,統一資源識別符號

URL :Uniform Resource Locator,統一資源定位符

URN:Uniform Resource Name,統一資源名稱

URL是URI的子集,URI包括URL和URN,URL與URN有交集,簡單的理解,網站的連結,網頁上圖片的連結,都是URL,而URN用得很少,知道有這麼個東西就夠了。

2.1.2超文字

超文字:英文名為超文字,例如網頁的原始碼的HTML就可以稱為超文字。

在鉻瀏覽器裡面開啟任意一個頁面,右擊空白處,選擇“檢查”(或者直接按下F12),即可開啟瀏覽器的開發者工具,在元素選項卡即可看到當前網頁的原始碼,這些原始碼都是超文字。

2.1.3 HTTP和HTTPS

URL以HTTP,HTTPS,FTP,SFTP,SMB開頭,這些都是協議。而HTTP是用於從網路傳輸超文字資料到本地瀏覽器的協議,它能保證高效而準確地傳送超文字文件。目前廣泛使用的是HTTP 1.1版本。

HTTPS的全稱是超文字傳輸​​協議安全套接字層的英文以安全為目標的HTTP通道,簡單講就是HTTP的安全版,即HTTP下加入SSL層,簡稱為HTTPS

某些網站雖然使用了HTTPS協議,但還是會被瀏覽器提示不安全,如在Chrome瀏覽器中開啟12306,連結為:https://www.12306.cn/,這時瀏覽器就會提示“您的連線不是私密連線”。(改用HTTP協議就可以正常開啟網頁)

原因:12306的CA證書是中國鐵道部自行簽發的,不被CA機構信任,因此這裡的證書驗證就不會被通過而提示不安全,但實際上它的資料傳輸依然的英文經過SSL加密的如果。要爬取這樣的站點,就需要設定忽略證書的選項,否則會提示SSL連結錯誤。 

2.1.4 HTTP請求過程

客戶端向伺服器傳送請求,伺服器接收到請求之後,進行處理和解析,然後返回對應的響應,接著傳回給瀏覽器。

響應裡面包含了頁面的原始碼等內容,瀏覽器再對其進行解析,便將網頁呈現了出來。

2.1.5請求

1.請求方法

常見的錢請求方法:GET和POST,區別:

  • GET請求中的引數包含在URL裡面,資料可以在URL中看到,而POST請求的URL不會包含這些資料,資料都是通過表單的形式傳輸的,會包含在請求體中。
  • GET請求提交的資料最多隻有1024位元組,而POST方式沒有限制。

請求的網址

即URL。

請求頭

比較重要的有餅乾,引用站點,使用者代理等。

在寫爬蟲時,大部分情況下都需要設定請求頭。

請求體

請求體一般承載的內容是POST請求中的表單資料,而對於GET請求,請求體則為空。

注意內容型別和POST提交資料方式的關係。在爬蟲中,如果要構造POST請求,需要使用正確的內容型別,並瞭解各種請求庫的各個引數設定時使用的是哪種內容型別,不然會導致POST提交之後無法正常響應。

2.1.6響應

1.響應狀態碼(Response Status Code)

表示伺服器的狀態,如200代表伺服器正常響應,404代表頁面沒有找到,500代表伺服器內部發生錯誤。

2.響應頭(Response Headers)

包含了伺服器對請求的應答資訊,如內容型別,伺服器,設定Cookie等。

3.響應體(Response Body)

響應的正文資料都在響應體重,比如請求網頁時,它的響應體就是網頁的HTML程式碼。我們做爬蟲請求網頁後,要解析的內容就是響應體。在瀏覽器開發者工具中點選預覽,就可以看到網頁的原始碼,也就是響應體的內容,它是解析的目標。

在做爬蟲時,我們主要通過響應體得到網頁的原始碼,JSON資料等,然後從中做相應內容的提取。

關於HTTP這部分的內容,可以看“圖解HTTP”瞭解更多,迅速過一遍即可。(可以網購也可以直接看PDF版本,點此下載

2.2網頁基礎

2.2.1網頁的組成

1. HTML

即超文字標記語言:超文字標記語言

我們在開發者模式中,在元素選項卡中即可看到網頁的原始碼。這些程式碼就是HTML,整個網頁就是由各種標籤巢狀組合而成的。簡言之,HTML定義了網頁的內容和結構。

2. CSS

全稱為Cascading Style Sheets,即層疊樣式

CSS是目前唯一的網頁頁面排版樣式標準。在網頁中,一般會統一定義整個網頁的樣式規則,並寫入CSS檔案中。在HTML中,只需要連結標籤即可引入寫好的CSS檔案,這樣整個頁面就會變得美觀,優雅。簡言之,CSS描述了網頁的佈局

3.JavaScript

簡稱JS,是一種指令碼語言.HTML和CSS配合使用,提供給使用者的只是一種靜態資訊,缺乏互動性。我們在網頁裡可能會看到一些互動和動畫效果,如下載進度條,提示框,輪播圖等,這通常就是JavaScript的功勞。簡言之,JavaScript定義了網頁的行為

2.2.2網頁的結構

<!--第一個 HTML 例子 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>This is a title</title>
</head>
<body>
<div id="container">
<div class="wrapper">
<h2 class = "title">Hello World</h2>
<p class = "text">Hello, this is a paragraph.</p>
</div>
</div>
</body>
</html>

這個例項便是網頁的一般結構。一個網頁的標準形式是html標籤內巢狀頭和身體標籤,頭內定義網頁的配置和引用,body內定義網頁的正文。

2.2.3節點樹及節點間的關係

在HTML中,所有標籤定義的內容都是節點,它們構成了一個HTML DOM樹。

DOM是W3C(全球資訊網聯盟)的標準,其全稱是文件物件模型,即文件物件模型。它定義了訪問HTML和XML文件的標準。而根據此標準,HTML文件中的所有內容都是節點。

2.2.4選擇器

在CSS中,我們使用CSS選擇器來定位節點。

三種常用的選擇方式:

  • 根據id:如上例中div節點的id為容器,就可以表示為#container,其中#開頭代表選擇id,其後緊跟id的名稱。
  • 根據類:以點(.)開頭代表選擇類,其後緊跟類的名稱。
  • 根據標籤名:例如想選擇二級標題,直接用h2即可。

想學習關於HTML,CSS,JavaScript的更多知識,建議參考  W3school中的教程

2.3爬蟲的基本原理

2.3.1爬蟲概述

簡單來說,爬蟲就是獲取網頁並提取和儲存資訊的自動化程式

1.獲取網頁(urllib,requests)

2.提取資訊(Beautiful Soup,pyquery,lxml)

3.儲存資料(TXT文字,JSON文字,【資料庫】MySQL,MongoDB,【遠端伺服器】SFTP)

4.自動化程式

2.3.2能抓取怎樣的資料

  • HTML原始碼
  • JSON字串
  • 二進位制資料(圖片,視訊,音訊)
  • CSS,JavaScript中,配置檔案
  • 總而言之,只要在瀏覽器中可以訪問,就可以將其抓取下來(基於HTTP或HTTPS協議的)

2.3.3 JavaScript渲染頁面

<!-- JavaScript 渲染頁面例子 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>This is a title</title>
</head>
<body>
<div id="container">
</div>
</body>
<script src = "app.js"></script>
</html>

body節點裡面只有一個id為container的節點,但是需要注意在body節點後引入了app.js,它負責整個網站的渲染。

對於這樣的情況,我們可以分析其後臺Ajax介面,也可使用Selenium,Splash這樣的庫來模擬JavaScript渲染。

2.4會話和Cookies

在瀏覽網站的過程中,我們經常會遇到需要登陸的情況,有些頁面只有登陸之後才可以訪問,而且登陸之後可以連續訪問很多次,但是有時候過一段時間就需要重新登陸。還有一些網站,在開啟瀏覽器的時候就自動登陸了,而且很長時間都不會失效。這裡面涉及了會話(Session)和Cookies。

2.4.1靜態網頁和動態網頁

靜態網頁:載入速度快,編寫簡單,但是存在很大的缺陷,如可維護性差,不能根據URL靈活多變地顯示內容。

動態網頁:可以動態解析URL中引數的變化,關聯資料庫並動態呈現不同的頁面內容,非常靈活多變。

2.4.2無狀態HTTP

HTTP協議對事務處理是沒有記憶能力的。

1.會話(在服務端,用來儲存使用者的會話資訊)

2. Cookies(在客戶端,有了Cookies,瀏覽器在下次訪問網頁時會自動附帶上它傳送給伺服器,伺服器通過識別Cookies並鑑定出是哪個使用者,然後再判斷使用者是否是登陸狀態,然後返回對應的響應。)

2.4.3常見誤區

“只要關閉瀏覽器,會話就消失了” - (錯誤)

由於關閉瀏覽器不會導致會話被刪除(因為瀏覽器不會在關閉前通知伺服器它將要關閉),這就需要伺服器為會話設定一個失效時間,當距離客戶端上一次使用會話的時間超過這個時間時,伺服器就可以認為這個客戶端已經停止了活動。

2.5代理的基本原理

2.5.1基本原理

本機不直接向Web伺服器傳送請求,而是向代理伺服器發出請求,請求會發送給代理伺服器,然後由代理伺服器再發送給Web伺服器,接著由代理伺服器再把Web伺服器返回的響應轉發給本機。

2.5.2代理的作用

  • 突破自身IP訪問限制,訪問一些平時不能訪問的站點。
  • 訪問內網資源
  • 提高訪問速度
  • 隱藏真實IP

2.5.3爬蟲代理

IP訪問過於頻繁的問題,就需要使用代理隱藏真實的IP,讓伺服器誤以為是代理伺服器在請求自己。

2.5.4代理分類

1.根據協議區分

  • FTP代理伺服器(埠一般為21,2121)

  • HTTP代理伺服器(8080,3128)

  • SSL / TLS代理伺服器(最高支援128位加密強度,443)

  • RTSP代理(554)

  • 遠端登入代理(主要用於TELENT遠端控制,23)

  • POP3 / STMP(110/25)

  • SOCKS代理

2.根據匿名程度區分

  • 高度匿名代理(會將資料包原封不動地轉發,伺服器端看來就像一個普通的使用者客戶端在訪問)
  • 普通匿名代理(會在資料包上做一些改動,有可能被發現這是個代理伺服器,也有一定機率被追查到真實IP)
  • 透明代理(一般用於提高瀏覽速度)
  • 間諜代理

2.5.5常用代理設定

  • 網上的免費代理(可用的代理不多,最好使用高匿)
  • 付費代理(質量比免費代理好很多)
  • ADSL撥號(穩定性高,也是一種比較有效的解決方案)