《 Python3 網路爬蟲開發實戰》學習筆記1-爬蟲基礎
本記錄將按照本人的學習程序,將學習過程中遇到的問題和重難點如實記錄下來,一個是鞏固自身所學,另一個也希望能對後來人有所幫助。
目錄(第1部分)
第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資料等,然後從中做相應內容的提取。
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撥號(穩定性高,也是一種比較有效的解決方案)