第二章、爬蟲基礎
2.2 網頁基礎
2.2.1 網頁的組成
網頁分爲三大部分—-HTML、CSS和JavaScript
1.HTML(內容和結構)
網頁的基礎框架就是HTML
開發者工具中Elements選項卡下左邊爲html,右邊爲CSS
2.CSS(佈局)
#head_wrapper.s-ps-islite .s-p-top{
position:absolute;
width:100%; //寬度100%佔滿父元素
}
這就是一個CSS樣式大括號前#head_wrapper.s-ps-islite .s-p-top就是一個CSS選擇器,此選擇器首先選中id爲head_wrapper且class爲s-ps-islite的節點,然後再選其內部的class爲s-p-top的節點。
3.JavaScript(行爲)
簡稱JS,是一種腳本語言,交互和動態效果就是JavaScript的功勞。HTML中通過script標籤引入JS。
2.2.2 網頁的結構(略)
2.2.3 節點樹及節點間的關係
W3C文檔對象模型(DOM)是中立與平臺和語言的接口.通過HTML DOM,樹中的所有節點都可以通過JavaScript訪問,並且修改或創建或刪除。
2.2.4 選擇器
根據id、class、標籤名篩選
CSS選擇器的語法規則見P91
2.3 爬蟲的基本原理
2.3.1 爬蟲概述
爬蟲就是獲取網頁並提取和保存信息的自動化程序。
1.獲取網頁
urllib、request庫等可以實現HTTP請求操作,得到響應後只需要解析數據結構中的body部分即可以得到網頁的源代碼
2.提取信息
獲取網頁的源代碼後接下來就是分析網頁源代碼,從中提取我們要的數據,用正則表達式提取是一個萬能辦法。還可以根據網頁節點屬性、CSS選擇器或XPath來提取網頁信息的庫,如Beautiful Soup、pyquery、lxml等。
3.保存數據
可以簡單保存爲TXT文本或JSON文本,也可以保存在數據庫中,如MySQL,MongoDB等,甚至保存至遠程服務器,如藉助SFTP來操作。
4.自動化程序
爬蟲就是代替人來完成爬蟲工作的自動化程序,並且能進行各種異常處理、錯誤重試等。
2.3.2 能抓怎樣的數據
可能有些網頁返回的不是HTML代碼,而是JSON字符串(API接口大多采用這樣的形式),它們同樣可以抓取。還可以抓取一些圖片、視頻等,只要在瀏覽器中可以訪問到的都可以抓取。
2.3.3 JavaScript渲染頁面
有時用urllib或requests抓取網頁時,得到的源代碼實際和瀏覽器中看到的不一樣。現在原來越多的網頁採用AJax、前端模塊化工具來構建,整個網頁可能都是由JavaScript渲染出來的,原始HTML代碼就只是一個空殼。用urllib或requests等庫請求這些網頁時,得到的只是HTML代碼,它不會繼續去加載這個JavaScript文件。如下代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>this is demo</title>
</head>
<body>
<div id="id">
</div>
</body>
<script src="app.js"></script>
</html>
對於這種情況,我們可以分析其後臺AJax接口,也可使用Selenium、Splash等庫實現模擬JavaScript渲染。
2.4 回話和Cookies
2.4.1 靜態網頁和動態網頁
&搭建最簡單的網站&
我們保存一個html文件,然後把它放在某臺具有固定公網IP的主機上,主機上安裝Apache或Nginx等服務器,這臺主機就可以作爲服務器了,其他人便可以訪問服務器看到這個頁面。
2.4.2 無狀態HTTP
HTTP的無狀態是指HTTP協議對事務處理沒有記憶功能的,也就是服務器不知道客戶端是什麼狀態。這種肯定不是我們想要的。這時出現了會話和Cookies這兩個保持HTTP連接狀態的技術。會話在服務器端,用來保存用戶的回話信息;Cookies在客戶端,有了Cookies瀏覽器在下次訪問網頁時會自動附帶上它發送給服務器,服務器通過識別Cookies並鑑定是哪個用戶,然後判斷用戶是否是登錄狀態,然後返回對應的響應。
可以理解爲Cookies裏保存了登錄的憑證,有了它,只需要在下次請求攜帶Cookies發送請求而不必重新輸入用戶名、密碼等信息重新登錄。所以在爬蟲中,有時候處理需要登錄才能訪問的頁面時,我們一般會直接將登錄成功後獲取的Cookies放在請求頭裏面直接請求,不必重新模擬登錄。
1.會話
會話對象用來存儲特定用戶會話所需的屬性及配置信息。
2.Cookies
指某些網站爲了辨別用戶身份、進行會話跟蹤而存儲在用戶本地終端上的數據。
- 會話維持
當客戶端第一次請求服務器時,服務器會返回一個請求頭中帶有set-Cookie字段的響應給客戶端,用來標記哪一個用戶,客戶端瀏覽器會把Cookies保存起來。當瀏覽器下一次訪問該網站時,瀏覽器會把此Cookies放到請求頭一起提交給服務器,Cookies攜帶了會話ID信息,服務器檢查該Cookies即可找到對應會話是什麼,然後判斷會話來辨認用戶狀態。
Cookies和會話需要配合,才能實現登錄會話控制。 - 屬性結構
開發者工具中打開application選項卡,左側的storage中有cookies,將其點開,每一個條目即使有個cookie。
每個cookie有如下屬性
name:一旦創建不能更改
value:如果值爲unicode字符,需要爲字符編碼,如果爲二進制數據,需要使用BASE64編碼
domain:可以訪問該cookie的域名
max age:該cookie失效時間,單位s,如果爲負數,則關閉瀏覽器時,cookie就失效
path:該cookie的使用路徑 - 會話cookie和持久cookie
會話cookie就是把cookie放在瀏覽器內存裏,關閉瀏覽器後該cookie即失效;
持久cookie則會保存到客戶端的硬盤裏,下次可以繼續使用 ;
嚴格來說,沒有會話cookie和持久cookie之分,只是由Cookie的max age或expires字段決定過期時間。
2.5 代理的基本原理
2.5.1 基本原理
代理實際就是代理服務器,它是網絡信息的中轉站。
2.5.2 代理的作用
- 訪問平時不能訪問的站點
- 訪問一些單位或團體內部
- 提高訪問速度
- 隱藏真實IP
2.5.3 常見代理設置
- 使用免費代理:最好使用高匿代理
- 使用付費代理服務
- ADSL撥號 :撥一次換一次IP