爬蟲 之基本原理


爬蟲到底是個什么玩意?

為什么要有這么多參數要設置?

到底應該怎么發送請求?

請求庫,解析庫,存儲數據的方式?

請求到的內容跟瀏覽器看到的內容不一樣?

 

爬蟲基本原理的梳理

1.什么是爬蟲?---->請求網站並提取數據的自動化程序。

  爬蟲呢也就是網絡爬蟲,可以理解為在網絡上爬行着一只蜘蛛,互聯網可以把它比喻為一個大網。這個爬蟲呢就是在這個網上一直爬來爬去的一個蜘蛛,它如果在這個互聯網上遇到一些網站資源就可以把它抓取下來。怎么抓取呢?就是由你來控制了。

 

#1、什么是互聯網?
    互聯網是由網絡設備(網線,路由器,交換機,防火牆等等)和一台台計算機連接而成,像一張網一樣。

#2、互聯網建立的目的?
    互聯網的核心價值在於數據的共享/傳遞:數據是存放於一台台計算機上的,而將計算機互聯到一起的目的就是為了能夠方便彼此之間的數據共享/傳遞,否則你只能拿U盤去別人的計算機上拷貝數據了。

#3、什么是上網?爬蟲要做的是什么?
    我們所謂的上網便是由用戶端計算機發送請求給目標計算機,將目標計算機的數據下載到本地的過程。
    #3.1 只不過,用戶獲取網絡數據的方式是:
      瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面。

    #3.2 而爬蟲程序要做的就是:
      模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中
 
    #3.1與3.2的區別在於:
      我們的爬蟲程序只提取網頁代碼中對我們有用的數據

#4、總結爬蟲
    #4.1 爬蟲的比喻:
      如果我們把互聯網比作一張大的蜘蛛網,那一台計算機上的數據便是蜘蛛網上的一個獵物,而爬蟲程序就是一只小蜘蛛,沿着蜘蛛網抓取自己想要的獵物/數據

    #4.2 爬蟲的定義:
      向網站發起請求,獲取資源后分析並提取有用數據的程序 

    #4.3 爬蟲的價值:
      互聯網中最有價值的便是數據,比如天貓商城的商品信息,鏈家網的租房信息,雪球網的證券投資信息等等,這些數據都代表了各個行業的真金白銀,
可以說,誰掌握了行業內的第一手數據,誰就成了整個行業的主宰,如果把整個互聯網的數據比喻為一座寶藏,那我們的爬蟲課程就是來教大家如何來高效地挖掘這些寶藏,
掌握了爬蟲技能,你就成了所有互聯網信息公司幕后的老板,換言之,它們都在免費為你提供有價值的數據。

 

 

爬蟲的流程:

我們平時在瀏覽網頁的時候,在瀏覽器里輸入一個網址,然后敲擊回車,我們就會看到網站的一些頁面,那么這個過程實際上就是這個瀏覽器請求了一些服務器然后獲取到了一些服務器的網頁資源,然后我們看到了這個網頁。

請求呢就是用程序來實現上面的過程,就需要寫代碼來模擬這個瀏覽器向服務器發起請求,然后獲取這些網頁資源。那么一般來說實際上獲取的這些網頁資源是一串HTML代碼,這里面包含HTML標簽,還有一些在瀏覽器里面看到的文字。那么我們要提取的一些數據就包含在這些HTML文本里面。我們要做的下一步工作就是從這些文本里提取我們想要的一些信息(比如一段話,一個手機號,一個文字這類的),這就是我們提取的一個過程。提取出來之后呢我們就把提取出來的信息存到數據庫啊文本啊這類的。這就是完成了一個數據采集的過程。

我們寫完程序之后呢就讓它一直運行着,它就能代替我們瀏覽器來向服務器發送請求,然后一直不停的循環的運行進行批量的大量的獲取數據了,這就是爬蟲的一個基本的流程。

 

 

爬蟲的工作原理:

打開一個瀏覽器---輸入網址---回車----看到呈現的有關關鍵字網站的列表(每一個網站里有標題,描述信息,站點,百度快照連接等等之類的)

我們要用爬蟲抓取有關新聞的網頁面的話怎么做呢?  -----> 點擊右鍵--審查元素---控制台(Elements是網頁源代碼(我們看到的網頁就是源代碼解析出來的),)-----> 把代碼獲取下來用一些解析庫把代碼解析出來然后存成一些結構化的數據。

 

什么是Request和Response?(請求和響應) 

瀏覽器訪問一個網站(域名:www.baidu.com)這個站點其實也是運行在一台一直運行着的電腦上的(這個就叫做服務器)

如果一點擊回車的話,實際上我的瀏覽器就向這個服務器發送了一個請求,這個請求里面就包含了一些信息,比如我要請求某某某頁面,那么這個流程就是向服務器發送了一個請求,這個服務器收到這個請求就會看你是什么瀏覽器發過來的,然后服務器經過解析之后呢向瀏覽器返回一個響應這就是一個Response。這Response里面內容呢就包含一些HTML代碼,那么瀏覽器解析這些代碼就是呈現出網頁內容了。這個流程就是Request和Response(請求和相應)的一個過程。

 

我們要用爬蟲抓取有關新聞的網頁面的話怎么做呢?  -----> 點擊右鍵--審查元素---控制台(Elements是網頁源代碼(我們看到的網頁就是源代碼解析出來的),Network)-----> 把代碼獲取下來用一些解析庫把代碼解析出來然后存成一些結構化的數據。 

 

 Network選項卡

下面有個列表形式的東西,里面有網址,還有status,type。。。

name里面放的是瀏覽器的請求和服務器的相應的記錄,點進一個去,有headers,preview,response,cookies,timing

headers :

  request headers      請求頭的信息

  response headers    響應頭的信息

  general                  請求的基本描述信息包括:請求的連接,請求的方法,請求的狀態碼,ip地址等等。。。

 

preview:   

response:            源代碼隱藏在這里,瀏覽器就解析這個代碼,然后呈現出網頁內容

cookies:

timing:

 

 

 

 

Request中包含什么?

請求,由客戶端向服務端發出,可以分為4部分內容:請求方法(Request Method)、請求的網址(Request URL)、請求頭(Request Headers)、請求體(Request Body)

一、請求方法  Request Method

  常見的請求方法有兩種:GET 和 POST。

  在瀏覽器中直接輸入URL並回車,這便發起了一個GET 請求,請求的參數會直接包含到URL里。例如在百度中搜索Github,這就是一個GET請求,鏈接為https://www.baidu.com/s?                    wd=Github&rsv_spt=1&rsv_iqid=0xebc1ff2d000fdfed&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=Python&rsv_t=7a32zwvyXvd90SKrPo8%2BE%2B5cMCxO5sqm7P9HJpvNjq5UpSqzHpZUi%2B6hBJRn6sGWg7lK&rsv_pq=ae74c7880000f00d&inputT=6006&rsv_sug3=27&rsv_sug1=23&rsv_sug7=100&rsv_sug2=0&rsv_sug4=6006,其中URL中包含了對請求的參數信息,這里參數 wd 表示要搜索的關鍵字。POST請求大多在表單提交是發起。比如,對於一個登錄表單,輸入用戶名和密碼后,點擊"登錄"按鈕,這通常會發起一個POST請求,其數據通常以表單的形式傳輸,而不會體現在URL中。

 

  GET 和 POST的區別?

  GET請求中的參數包含在URL里面,數據可以在URL中看到,而POST請求的URL不會包含這些數據,數據都是通過表單形式傳輸的,會包含在請求體中。

  GET請求提交的數據最多只有1024字節,而POST方式沒有限制。

  一般來說,登錄時,需要提交用戶名和密碼,其中包含了敏感信息,使用GET 方法請求的話,密碼就會暴露在URL中,造成密碼泄露,所以這里最好以POST方式發送。上傳文件時,由於文件內容比較大,也會選用POST方式。

 

  我們平常遇到的絕大部分請求都是GET 和 POST請求,另外還有一些請求方法如HEAD、PUT、 DELETE、 OPTIONS、 CONNECT、 TRACE等,我們簡單的將其總結為:

方法 描述
GET 請求頁面,並返回頁面內筒
HEAD 類似於GET請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST 大多數用於提交表單或上傳文件,數據包含在請求體中
PUT 從客戶端向服務器傳送的數據取代指定文檔中的內容
DELETE 請求服務器刪除指定的頁面
CONNECT 把服務器當做跳板,讓服務器代替客戶端訪問其他網頁
OPTIONS 允許客戶端查看服務器的性能
TRACE 回顯服務器收到的請求,主要用於測試或診斷

 

 

二、請求的網址

  請求URL即統一資源定位符,它可以唯一確定我們想請求的資源。比如一個網頁文檔、一張圖片、一個視頻等都可以用URL來確定。

 

 

三、請求頭  Request Headers (鍵值對的形式) 請求的一些配置信息告訴服務器,讓服務器判斷這些配置信息解析

  請求頭,用來說明服務器要使用的附加信息,比較重要的信息有Cookie,Referer,User-Agent等。

  下面簡要說明一些常用的頭信息。

  Accept: 請求報頭域,用於指定客戶端可接受哪些類型的信息。

  Accept - Language: 指定客戶端可接受的語言類型。

  Accept-Encoding: 指定客戶端可接受的內容編碼。

   Host:用於指定請求支援的主機IP和端口號,其內容為請求URL的原始服務器或網關的位置。從HTTP1.1版本開始,請求必須包含此內容。

   Cookie: 也常用復數形式Cookies,這是網站為了辨別用戶進行會話跟蹤而存儲在用戶本地的數據。它的主要功能是維持當前訪會話。例如,我們輸入用戶名和密碼成功登錄某個網站后,服務器會用會話保存登錄狀態信息,后面我們每次刷新或請求該站點的其他頁面時,會發現都是登錄狀態,這就是Cookies的功勞。Cookies里有信息標識了我們所對應的服務器的會話,每次瀏覽器在請求該站點的頁面時,都會在請求頭加上Cookies 並將其返回給服務器,服務器通過Cookies識別出是我們自己,並且查出當前狀態是登錄狀態,所以返回結果就是登陸之后才能看到的網頁內容。

   Referer:  此內容用來標識這個請求是從哪個頁面發過來的,服務器可以拿到這一信息並做相應處理,如做來源統計、防盜鏈處理等。

   User-Agent:  簡稱UA,它是一個特殊的字符串頭,可以使服務器識別客戶使用的操作系統及版本、瀏覽器及版本等信息。再做爬蟲時加上此信息,可以偽裝為瀏覽器:如果不加,很容易可能被識別出為爬蟲。

   Content-Type:  也叫互聯網媒體類型(Internet Media Type)或者MIME類型,在HTTP協議消息頭中,它用來表示具體請求中的媒體類型信息。例如,text/html 代表HTML格式,image/gif 代表GIF圖片,application/json 代表JSON類型,更多對應關系可以查看此對照表:

http://tool.oschina.net/commons.

  因此,請求頭是請求的重要組成部分,在寫爬蟲時,大部分情況下都需要設定請求頭

 

四、請求體

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

  例如,我們登錄GitHub時捕獲到的請求和響應如圖:

 

 登錄之前,我們填寫了用戶名和密碼信息,提交時這些內容就會以表單數據的形式提交給服務器,此時需要注意 Requsest Headers 中指定的Content-Type 為 application/x-www-form-urlencoded。只有設置Content-Type為application/x-www-form-urlencoded,才會以表單數據的形式提交。另外,我們也可以將Content-Type 設置為application/json來提交JSON數據,或者設置為multipart/from-data來上傳文件。

以下表列出了Content-Type 與 POST提交數據方式的關系

Content-Type 提交數據的方式
application/x-www-form-urlencoded 表單數據
multipart/from-data 表單文件上傳
application/json 序列化JSON數據
text/xml XML數據

 

在爬蟲中,如果要構造POST請求,需要使用正確的Content-Type,並了解各種請求庫的各個參數設置時使用的是那種Content-Type,不然可能會導致POST提交后無法正常響應。

 

 

 

Response中包含什么內容?

響應,由服務端返回給客戶端,可以分為三部分:響應狀態碼(Response Status Code)、響應頭(Response Headers)、響應體(Response Body)

 

 

1、響應狀態碼

  響應狀態碼表示服務器的響應狀態,如200代表服務器正常響應,404代表頁面未找到,500代表服務器內部發生錯誤。在爬蟲中,我們可以根據狀態碼來判斷服務器響應狀態,如狀態碼為200,則證明成功返回數據,在進行進一步的處理,否則直接忽略。

 

2、響應頭

  響應頭包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等。下面簡要說明一些常用的頭信息。

  Date:                   標識響應產生的時間。

  Last-Modified:     指定資源的最后修改時間。

  Content-Encoding:指定響應內容的編碼。

  Server:                 包含服務器的信息,比如名稱、版本號等。

  Content-Type:     文檔類型,指定返回的數據類型是什么,如text/html代表返回HTML文檔,application/x-javascript則代表返回JavaScript文件,image/jpeg則代表返回圖片。

  Set-Cookie:       設置Cookies。響應頭中的Set-Cookie 告訴瀏覽器需要將此內容放在Cookies中,下次請求攜帶Cookies請求。

  Expires:             指定響應的過期時間,可以使代理服務器或瀏覽器將加載的內容更新到緩存中。如果再次訪問時,就可以直接從緩存中加載,降低服務器負載,縮短加載時間。

 

 

3、響應體

  最重要的當屬響應體的內容了。響應的正文數據都在響應體中,比如請求網頁時,它的響應體就是網頁的HTML代碼;請求一張圖片時,它的響應體就是圖片的二進制數據。我們走爬蟲請求網頁后,要解析的內容就是響應體,如圖所示:

 

在瀏覽器開發者工具中點Preview,就可以看到王爺的源代碼,也就是響應體的內容,它是解析的目標。

在做爬蟲時,我們主要通過響應體得到的網頁的源代碼、JSON數據等,然后從中做相應內容的提取。

 用http請求庫向服務器發送一個請求,然后得到這個response,把這個響應體里的內容拿下來,然后解析就可以拿到我們的數據了。

 

 

 

 

 

爬蟲能抓怎樣的數據呢?

 

 

怎樣來解析?

 

 

 

 

為什么我抓到的數據和瀏覽器中看到的不一樣?

怎么解決JavaScript渲染的問題?

 

 

怎樣可以保存數據?

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM