什么是網絡爬蟲?
除了百度百科所講,通俗來講,我平時瀏覽的頁面大都是HTML頁面,包括我們平時瀏覽的新聞,門戶網站等都是將文字內容鑲嵌在HTML代碼中的,比如騰訊新聞的這篇文章:
爬蟲要做的可以簡單理解為利 用程序來獲取我們需要的網絡上的內容,包括文字,視頻,圖片等信息 稱之為 數據。
首先你要知道 當你點擊一下百度,發生了什么,能把你想要的數據返回到你的電腦屏幕上
簡單來說這段過程發生了以下四個步驟:
-
瀏覽器通過 DNS服務器 查找域名對應的 IP地址;
-
向 IP地址 對應的 Web服務器 發送請求;
-
Web服務器 響應請求,發回 HTML頁面;
-
瀏覽器解析 HTML內容,並顯示出來。
HTTP和HTTPS
HTTP協議
(HyperText Transfer Protocol,超文本傳輸協議):是一種發布和接收 HTML頁面的方法。
HTTPS
(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層。
SSL
(Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡連接進行加密,保障在Internet上數據傳輸的安全。
HTTP
的端口號為80
,HTTPS
的端口號為443
HTTP工作原理
網絡爬蟲抓取過程可以理解為模擬瀏覽器操作的過程
。
瀏覽器的主要功能是向服務器發出請求,在瀏覽器窗口中展示您選擇的網絡資源,HTTP是一套計算機通過網絡進行通信的規則
瀏覽器發送HTTP請求的過程:
-
當用戶在瀏覽器的地址欄中輸入一個URL地址並按回車鍵之后,瀏覽器會向HTTP服務器發送HTTP請求。 HTTP請求主要分為
Get
和Post
兩種方法。 -
當我們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發送一個Request請求去獲取 http://www.baidu.com 的html文件,服務器把Response文件對象發送回給瀏覽器。
-
瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件等。
-
當所有的文件都下載成功后,網頁會根據HTML語法結構,完整的顯示出來了。
URL
(Uniform / Universal Resource Locator的縮寫):統一資源定位符,是用於完整地描述Internet上
HTTP請求主要分為Get
和Post
兩類:
-
GET是從服務器上獲取指定頁面信息,POST是向服務器提交數據並獲取頁面信息。
-
GET請求參數都顯示在URL上,服務器根據該請求所包含URL中的參數來產生響應內容。 "Get" 請求的參數 是URL的一部分。
-
POST請求參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向HTTP服務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等)。 "POST"請求的參數 不在URL中,而在請求體中。
get請求的參數都在網址里面包含,所以我們有時候看到一個網址特別長,后邊帶了一坨東西。post請求一般是用於表單提交,將賬號密碼以post的方式發送。
當你任意點開客戶端與服務期的一次信息交互,你會看到它訪問客戶端攜帶的參數也就是頭部信息:request headers (常用) 以及客戶端的回應response headers
前邊說過了,我們鼠標每點擊一次,就是對服務器發送了一次請求,等待服務器給你響應
當我們打開一個網頁,右鍵點擊選擇查看源代碼是可以查看源代碼的,點擊審查元素 和檢查元素,就可以對客戶端與服務器之間的信息交流進行查看如圖:
第一個箭頭指向的位置 —點擊一下,然后點擊文章相應位置,它會指向代碼中內容的位置,可以幫助我們查看數據在網頁中的結構和位置
第二給箭頭是網絡 — 點擊network ,重新刷新頁面,你會看到客戶端和服務器之間的數據來往,也是我們今后用的最多的
第三個箭頭 是 —all是所有的數據來往,xhr一般ajax加載的數據會在這里面找到,js是js的一些請求,里面也有我們要的數據,少數
下邊方框里面 分別是 name status(狀態碼) type size 等 了解一下即可,狀態 200是正常,其他異常狀態碼可以百度,size點擊可以按大小排列 這個后邊還是挺方便的
Request和Response
- Request:瀏覽器就發送消息給該網址所在的服務器,這個過程叫做HTTP Request。
- Response:服務器收到瀏覽器發送的消息后,能夠根據瀏覽器發送消息的內容,做相應處理,然后把消息回傳給瀏覽器。這個過程叫做HTTP Response。瀏覽器收到服務器的Response信息后,會對信息進行相應處理,然后展示。
Request詳解
- 請求方式:主要有GET、POST兩種類型,另外還有HEAD、PUT、DELETE、OPTIONS等。
- 請求URL:URL全稱統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等都可以用URL唯一來確定。
- 請求頭:包含請求時的頭部信息,如User-Agent、Host、Cookies等信息。
- 請求體:請求時額外攜帶的數據如表單提交時的表單數據
Response詳解
- 響應狀態:有多種響應狀態,如200代表成功、301跳轉、404找不到頁面、502服務器錯誤
- 響應頭:如內容類型、內容長度、服務器信息、設置Cookie等等。
- 響應體:最主要的部分,包含了請求資源的內容,如網頁HTML、圖片二進制數據等。
爬蟲基本流程
- 發起請求:通過HTTP庫向目標站點發起請求,即發送一個Request,請求可以包含額外的headers等信息,等待服務器響應。
- 獲取響應內容:如果服務器能正常響應,會得到一個Response,Response的內容便是所要獲取的頁面內容,類型可能有HTML,Json字符串,二進制數據(如圖片視頻)等類型。
- 解析內容:得到的內容可能是HTML,可以用正則表達式、網頁解析庫進行解析。可能是Json,可以直接轉為Json對象解析,可能是二進制數據,可以做保存或者進一步的處理。
- 保存數據:保存形式多樣,可以存為文本,也可以保存至數據庫,或者保存特定格式的文件。
能抓取哪些數據
- 網頁文本:如HTML文檔、Json格式文本等。
- 圖片:獲取到的是二進制文件,保存為圖片格式。
- 視頻:同為二進制文件,保存為視頻格式即可。
- And so on:只要是能請求到的,都能獲取。
解析方式
- 直接處理
- Json解析
- 正則表達式
- BeautifulSoup
- PyQuery
- XPath
抓取中出現的問題
問:為什么我抓到的和瀏覽器看到的不一樣?
答:網頁通過瀏覽器的解析,加載CSS與JS等文件對網頁進行解析渲染,達到我們看到絢麗的網頁,而我們抓到的文件只是一些代碼,css文件無法調用,使得樣式不能表現出來,那么網頁就會出現錯位等等問題。
問:怎樣解決JavaScript渲染的問題?
答:分析Ajax請求、Selenium/WebDriver、Splash、PyV8、Ghost.py等庫
保存數據
- 文本:純文本、Json、Xml等。
- 關系型數據庫:如MySQL、Oracle、SQL Server等具有結構化表結構形式存儲。
- 非關系型數據庫:如MongoDB、Redis等Key-Value形式存儲。
- 二進制文件:
如圖片、視頻、音頻等等直接保存成特定格式即可。