python爬蟲初認識

 

1、爬蟲是什麼?

若是咱們把互聯網比做一張大的蜘蛛網,數據即是存放於蜘蛛網的各個節點,而爬蟲就是一隻小蜘蛛,css

沿着網絡抓取本身的獵物(數據)爬蟲指的是:向網站發起請求,獲取資源後分析並提取有用數據的程序;html

從技術層面來講就是 經過程序模擬瀏覽器請求站點的行爲,把站點返回的HTML代碼/JSON數據/二進制數據(圖片、視頻) 爬到本地,進而提取本身須要的數據,存放起來使用。python

2、爬蟲的基本流程:

用戶獲取網絡數據的方式:web

方式1:瀏覽器提交請求--->下載網頁代碼--->解析成頁面正則表達式

方式2:模擬瀏覽器發送請求(獲取網頁代碼)->提取有用的數據->存放於數據庫或文件中 算法

爬蟲要作的就是方式2;docker

一、發起請求數據庫

使用http庫向目標站點發起請求,即發送一個Requestjson

Request包含:請求頭、請求體等 數組

Request模塊缺陷:不能執行JS 和CSS 代碼

二、獲取響應內容

若是服務器能正常響應,則會獲得一個Response

Response包含:html,json,圖片,視頻等 

三、解析內容

解析html數據:正則表達式(RE模塊),第三方解析庫如Beautifulsoup,pyquery等

解析json數據:json模塊

解析二進制數據:以wb的方式寫入文件

四、保存數據

數據庫(MySQL,Mongdb、Redis)

文件 

3、http協議 請求與響應

Request:用戶將本身的信息經過瀏覽器(socket client)發送給服務器(socket server)

Response:服務器接收請求,分析用戶發來的請求信息,而後返回數據(返回的數據中可能包含其餘連接,如:圖片,js,css等)

ps:瀏覽器在接收Response後,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求而後接收Response後,是要提取其中的有用數據

4、 request

一、請求方式:

常見的請求方式:GET / POST 

二、請求的URL

url全球統一資源定位符,用來定義互聯網上一個惟一的資源 例如:一張圖片、一個文件、一段視頻均可以用url惟一肯定

url編碼

https://www.baidu.com/s?wd=圖片

圖片會被編碼

加載一個網頁,一般都是先加載document文檔,

在解析document文檔的時候,遇到連接,則針對超連接發起下載圖片的請求

三、請求頭

User-agent:請求頭中若是沒有user-agent客戶端配置,服務端可能將你當作一個非法用戶host;

cookies:cookie用來保存登陸信息

注意: 通常作爬蟲都會加上請求頭

請求頭須要注意的參數:

(1)Referrer:訪問源至哪裏來(一些大型網站,會經過Referrer 作防盜鏈策略;全部爬蟲也要注意模擬)

(2)User-Agent:訪問的瀏覽器(要加上不然會被當成爬蟲程序)

(3)cookie:請求頭注意攜帶

四、請求體

請求體
    若是是get方式,請求體沒有內容 (get請求的請求體放在 url後面參數中,直接能看到)
    若是是post方式,請求體是format data

    ps:
    一、登陸窗口,文件上傳等,信息都會被附加到請求體內
    二、登陸,輸入錯誤的用戶名密碼,而後提交,就能夠看到post,正確登陸後頁面一般會跳轉,沒法捕捉到post

5、 響應Response

一、響應狀態碼

  200:表明成功

  301:表明跳轉

  404:文件不存在

  403:無權限訪問

  502:服務器錯誤

二、respone header

響應頭須要注意的參數:

(1)Set-Cookie:BDSVRTM=0; path=/:可能有多個,是來告訴瀏覽器,把cookie保存下來

(2)Content-Location:服務端響應頭中包含Location返回瀏覽器以後,瀏覽器就會從新訪問另外一個頁面 

三、preview就是網頁源代碼

JSO數據

如網頁html,圖片

二進制數據等 

6、總結

一、總結爬蟲流程:

 爬取--->解析--->存儲

二、爬蟲所需工具:

 請求庫:requests,selenium(能夠驅動瀏覽器解析渲染CSS和JS,但有性能劣勢(有用沒用的網頁都會加載);)
 解析庫:正則,beautifulsoup,pyquery
 存儲庫:文件,MySQL,Mongodb,Redis

7、爬蟲知識總結

 

 

經常使用第三方庫

對於爬蟲初學者,建議在瞭解爬蟲原理之後,在不使用任何爬蟲框架的狀況下,使用這些經常使用的第三方庫本身實現一個簡單的爬蟲,這樣會加深對爬蟲的理解。

urllib和requests都是python的HTTP庫,包括urllib2模塊以巨大的複雜性代價獲取綜合性的功能。相比於urllib2,Requests模塊更能簡約的支持完整的簡單用例。關於urllib和requests的優缺點和區別,你們能夠去網上查一下。

BeautifulSoup和lxml都是python頁面解析的庫。BeautifulSoup 是基於 DOM 的,會載入整個文檔,解析整個DOM樹,所以時間和內存開銷都會大不少。而lxml只會進行局部遍歷,使用xpath可以很快定位標籤。bs4 是用 python 寫的,lxml 是 c 語言實現的,也決定了lxml比bs4要快。

爬蟲框架

python經常使用的爬蟲框架就是scrapy和pyspider兩個。

關於框架的使用方法及詳細介紹,可參考官方文檔。

動態頁面渲染

1. url請求分析

(1)認真分析頁面結構,查看js響應的動做;

(2)藉助瀏覽器分析js點擊動做所發出的請求url;

(3)將此異步請求的url做爲scrapy的start_url或者yield reques再次進行抓取。

2. selenium

Selenium是一個Web的自動化測試工具,最初是爲網站自動化測試而開發的,類型像咱們玩遊戲用的按鍵精靈,能夠按指定的命令自動化操做,不一樣是Selenium能夠直接運行在瀏覽器上,它支持全部主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器)。

Selenium能夠根據咱們的指令,讓瀏覽器自動加載頁面,獲取須要的頁面,甚至頁面截屏,或者判斷網站上某些動做是否發生。

Selenium本身不帶瀏覽器,不支持瀏覽器的功能,它須要與第三方瀏覽器結合在一塊兒才能使用。

3. phantomjs

使用selenium調用瀏覽器進行抓取頁面時,因爲要執行打開瀏覽器並渲染頁面的操做,當進行大規模數據抓取時效率較低,沒法知足需求。這時咱們能夠選擇使用phantomjs。

PhantomJS是一個基於Webkit的"無界面"(headless)瀏覽器,它會把網站加載到內存並執行頁面上的Java,由於不會展現圖形界面,因此運行起來比完整的瀏覽器更高效。

若是咱們把Selenium和PhantomJS結合在一塊兒,就能夠運行一個很是強大的網絡爬蟲了,這個爬蟲能夠處理Java、Cookie、headers,以及任何咱們真實用戶須要作的事情。

4. splash

Splash是一個Java渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具備異步處理能力,以發揮webkit的併發能力。

python鏈接splash的庫叫作scrapy-splash,scrapy-splash使用的是Splash HTTP API, 因此須要一個splash instance,通常採用docker運行splash,因此須要安裝docker。

5. spynner

spynner是一個QtWebKit的客戶端,它能夠模擬瀏覽器,完成加載頁面、引起事件、填寫表單等操做。

爬蟲防屏蔽策略

1. 修改User-Agent

User-Agent是一種最多見的假裝瀏覽器的手段。

User-Agent是指包含瀏覽器信息、操做系統信息等的一個字符串,也稱之爲一種特殊的網絡協議。服務器經過它判斷當前訪問對象是瀏覽器、郵件客戶端仍是網絡爬蟲。在request.headers裏能夠查看user-agent,關於怎麼分析數據包、查看其User-Agent等信息,這個在前面的文章裏提到過。

具體方法能夠把User-Agent的值改成瀏覽器的方式,甚至能夠設置一個User-Agent池(list,數組,字典均可以),存放多個「瀏覽器」,每次爬取的時候隨機取一個來設置request的User-Agent,這樣User-Agent會一直在變化,防止被牆。

2. 禁止cookies

cookie實際上是儲存在用戶終端的一些被加密的數據,有些網站經過cookies來識別用戶身份,若是某個訪問老是高頻率地發請求,極可能會被網站注意到,被嫌疑爲爬蟲,這時網站就能夠經過cookie找到這個訪問的用戶而拒絕其訪問。

經過禁止cookie,這是客戶端主動阻止服務器寫入。禁止cookie能夠防止可能使用cookies識別爬蟲的網站來ban掉咱們。

在scrapy爬蟲中能夠設置COOKIES_ENABLES= FALSE,即不啓用cookies middleware,不向web server發送cookies。

3. 設置請求時間間隔

大規模集中訪問對服務器的影響較大,爬蟲能夠短期增大服務器負載。這裏須要注意的是:設定下載等待時間的範圍控制,等待時間過長,不能知足短期大規模抓取的要求,等待時間太短則頗有可能被拒絕訪問。

設置合理的請求時間間隔,既保證爬蟲的抓取效率,又不對對方服務器形成較大影響。

4. 代理IP池

其實微博識別的是IP,不是帳號。也就是說,當須要連續抓取不少數據的時候,模擬登陸沒有意義。只要是同一個IP,無論怎麼換帳號也沒有用,主要的是換IP。

web server應對爬蟲的策略之一就是直接將IP或者整個IP段都封掉禁止訪問,當IP被禁封后,轉換到其餘IP繼續訪問便可。方法:代理IP、本地IP數據庫(使用IP池)。

5. 使用Selenium

使用Selenium來模擬人工點擊訪問網站,是種頗有效的防止被ban的方式。可是Selenium效率較低,不適合大規模數據抓取。

6. 破解驗證碼

驗證碼是如今最多見的防止爬蟲的手段。有能力的小夥伴能夠本身寫算法破解驗證碼,不過通常咱們能夠花點錢使用第三方打碼平臺的接口,輕鬆實現驗證碼的破解。

相關文章
相關標籤/搜索