python 爬蟲(八)常見的反爬措施以及應對措施(爬蟲必備)+ 動態Html頁面的處理方法 + selenium+PhantomJS的介紹及安裝

python中文件操作的小知識: 如何打印一個文件同時輸出行號

方法:枚舉enumerate

fp = open('test.txt','r',encoding='utf-8')
	print(fp)
	#如何輸出行號
	for i,c in enumerate(fp,1):  ## 接收兩個參數,第一個爲遍歷內容,第二個爲起始行號,默認爲0
		print(i,c)

在這裏插入圖片描述


一、常見的反爬措施以及應對措施


爬蟲與反爬蟲的鬥爭一直都存在着,雙方時刻都可能上演一番大戰。下面是一些我總結的反爬蟲與爬蟲應對措施


反爬蟲與反爬策略:

1. 通過Headers反爬蟲


(1)通過user-agent客戶端標識來判斷是否是爬蟲

  • 簡介:一般通過是否有user-agent(客戶端版本信息)可以輕易判斷是不是爬蟲
  • 解決的辦法:封裝請求頭添加use-agent。

(2)防盜鏈

  • 簡介:防盜鏈主要是針對客戶端請求過程中所攜帶的一些關鍵信息來驗證請求的合法性,而防盜鏈又有很多種,比如Referer防盜鏈、時間戳防盜鏈等等,這裏講的是Referer防盜鏈。Referer用於告知服務器該請求是從哪個頁面鏈接過來的。
  • 解決辦法:封裝請求頭headers添加Referer字段以及相應的值。

2. 通過訪問頻率來判斷


  • 簡介:對於一些網站來說,如果某個IP在單位時間裏的訪問頻率過高,會限制訪問

  • 解決的辦法設置爬取間隔(涉及到等待)

    • (1)最蠢的強制等待time.sleep
      a = random.randint(5) time.sleep(a)
    • (2)隱式等待(等待你規定的時間,如10秒)
      driver.implicitly_wait(10)
    • (3)顯示等待(設置等待間隔)
      wait = WebDriverWait( driver,#瀏覽器驅動對象 10,最大等待時長 0.5,掃描間隔 )

3. 封ip


  • 簡介:如果某個IP在單位時間裏的訪問次數超過了某個閾值,那麼服務器就會ban掉這個IP。
  • 解決辦法使用代理IP。網上有很多免費代理和付費代理可供選擇,免費代理比如:西刺代理、快代理等等,付費代理比如:代理雲、阿布雲等等。除此之外,我們還可以建一個屬於自己的代理池以供使用

4. 在html中動手腳


  • 簡介:比如JS加密啊JS混淆啊,真是搞得人頭大。不過我們這裏先說那些在html中動手腳的,比如加一些無意義的字符之類的,這樣即使我們能爬下來,得到的數據也是沒法使用的。
  • 案例:在這裏插入圖片描述
  • 解決辦法:使用lxml解析,解析完之後再對數據做一下清洗(個人認爲lxml還是比較好用的)

4. 頁面內容無法直接獲取數據,頁面都是js代碼動態頁面反爬蟲(ajax)


  • 簡介:頁面只有無用的頭部和尾部信息,具體信息都被放在js中了
  • 案例:在這裏插入圖片描述
  • 解決辦法:selenium+phantomjs可以獲取頁面數據

5. 蜜罐技術


  • 簡介:蜜罐這個詞,最早是來自於網絡攻防中。一方會故意設置一個或者幾個服務器,故意留下漏洞,讓另一方輕易的入侵進來。這些被故意設置的服務器,就叫做蜜罐。裏面可能安裝了監控軟件,用來監控入侵者。同時,蜜罐還可以拖延入侵者的時間。在反爬蟲的機制中,也有一種蜜罐技術。網頁上會故意留下一些人類看不到或者絕對不會點擊的鏈接。由於爬蟲會從源代碼中獲取內容,所以爬蟲可能會訪問這樣的鏈接。這個時候,只要網站發現了有IP訪問這個鏈接,立刻永久封禁該IP + User-Agent + Mac地址等等可以用於識別訪問者身份的所有信息。這個時候,訪問者即便是把IP換了,也沒有辦法訪問這個網站了。給爬蟲造成了非常大的訪問障礙。

  • 解決辦法:定向爬蟲的爬行軌跡是由我們來決定的,爬蟲會訪問哪些網址我們都是知道的。因此即使網站有蜜罐,定向爬蟲也不一定會中招。


6. 隨機化網頁源碼


  • 簡介:用display:none來隨機化網頁源碼,有網站還會隨機類和id的名字,然後再加點隨機的tr和td,這樣的話就增大了我們解析的難度。比如全網代理IP:
  • 案例:在這裏插入圖片描述
  • 解決辦法:可以看到每個IP都是包含在一個class爲“ip”的td裏的,所以我們可以先定位到這個td,然後進行下一步解析。雖然這個td裏面包含了很多的span標籤和p標籤,而且也每個標籤的位置也沒有什麼規律,不過還是有辦法解析的。方法就是把這個td裏的所有文字提取出來,然後把那些前後重複的部分去除掉,最後拼接到一起就可以了

生動的總結圖:在這裏插入圖片描述


二、動態Html頁面的處理方法


1. 常見的一些頁面技術


(1)js(JavaScript)

html使我們頁面的骨架,css是頁面裝飾,js是頁面的靈魂。

JavaScript 是網絡上最常用也是支持者最多的客戶端腳本語言。它可以收集 用戶的跟蹤數據,不需要重載頁面直接提交表單,在頁面嵌入多媒體文件,甚至運行網頁遊戲。
我們可以在網頁源代碼的標籤裏看到。

比如:

<script type="text/javascript" 	src="http://statics.huxiu.com/w/mini/static_2015/js/sea.js?v=201601150944"	></script> 

豆瓣就是這樣的例子:在這裏插入圖片描述


(2)jquery

jquery是一個js庫,可以是js代碼更加簡化。

jQuery 是一個十分常見的庫,70% 最流行的網站(約 200 萬)和約 30% 的其他網站(約 2 億)都在使用。一個網站使用 jQuery 的特徵,就是源代碼裏包含了 jQuery 入口。

比如:

<script type="text/javascript" 	src="http://statics.huxiu.com/w/mini/static_2015/js/jquery-1.11.1.min.js?V	=201512181512"></script> 

注意:如果你在一個網站上看到了 jQuery,那麼採集這個網站數據的時候要格外小心。jQuery 可 以動態地創建 HTML 內容,只有在 JavaScript 代碼執行之後纔會顯示。如果你用傳統的方法採集頁面內容,就只能獲得 JavaScript 代碼執行之前頁面上的內容。


(3)ajax:web頁面的異步請求

我們與網站服務器通信的唯一方式,就是發出 http 請求獲取新頁面。如果提交表單之後,或從服務器獲取信息之後,網站的頁面不需要重新刷新,那麼你訪問的網站就在用Ajax 技術。

Ajax 其實並不是一門語言,而是用來完成網絡任務(可以認爲 它與網絡數據採集差不多)的一系列技術。Ajax 全稱是 Asynchronous JavaScript and XML(異步 JavaScript 和 XML),網站不需要使用單獨的頁面請求就可以和網絡服務器進行交互 (收發信息)。


(4)DHTML

和Ajax 一樣,動態 HTML(Dynamic HTML, DHTML)也是一系列用於解決網絡問題的 技術集合。
DHTML 是用客戶端語言改變頁面的 HTML 元素(HTML、CSS,或者二者皆 被改變)。比如頁面上的按鈕只有當用戶移動鼠標之後纔出現,背景色可能每次點擊都會改變,或者用一個 Ajax 請求觸發頁面加載一段新內容,網頁是否屬於DHTML,關鍵要看有沒有用 JavaScript 控制 HTML 和 CSS 元素。


2. 遇到動態頁面的處理方法


用 Python 解決這個問題只有兩種途徑:

  • 1、直接從 JavaScript 代碼裏採集內容(費時費力)
  • 2、用 Python 的 第三方庫運行 JavaScript,直接採集你在瀏覽器裏看到的頁面(這個可以有)。

下面就會介紹這種技術


三、selenium的介紹及安裝


1. Selenium簡介


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

  • 作用:Selenium 可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。

  • 注意Selenium 自己不帶瀏覽器不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。


2. Selenium的安裝


兩種安裝方式:

  • 第一種:可以從 PyPI 網站下載 Selenium庫http://pypi.python.org/simple/selenium
  • 第二種:使用第三方管理器 pip用命令安裝:pip install selenium==2.48.0

這裏使用pip安裝在這裏插入圖片描述
Selenium 官方參考文檔:http://selenium-python.readthedocs.io/index.html


四、PhantomJS 的簡介及安裝


1. PhantomJS簡介


  • 定義: PhantomJS 是一個基於Webkit的“無界面”(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,因爲不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。
  • 作用: 如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、cookie、headers,以及任何我們真實用戶需要做的事情。

PhantomJS 官方參考文檔:http://phantomjs.org/documentation


2. PhantomJS的安裝


  • 注意:PhantomJS 只能從它的官方網站http://phantomjs.org/download.html) 下載。
  • 原因: 因爲 PhantomJS 是一個功能完善(雖然無界面)的瀏覽器而非一個 Python 庫,所以它不需要像 Python 的其他庫一樣安裝,但我們可以通過Selenium調用PhantomJS來直接使用。

(1)無界面phantomjs鏡像

安裝步驟:

  • 百度搜索phantomjs鏡像
  • 選取安裝包在這裏插入圖片描述
  • 下載解壓在這裏插入圖片描述
  • 配置環境變量(兩種方法)
    • 第一種:我們安裝過anaconda,放在anaconda的scripts目錄下(因爲scripts目錄爲加載所有第三方庫的)
      • 步驟:
        • ① 第一步: 取出其bin目錄下的phantomjs.exe在這裏插入圖片描述
        • ② 第二步: 放在anaconda/scripts下在這裏插入圖片描述
        • ③第三步: 此時就可以通過selenium調用phantomjs
    • 第二種:配置環境變量
      • ① 第一步: 下載–解壓,然後,設置環境變量:C:\Users\cz\Downloads\phantomjs-2.1.1-windows\bin

      • ② 第二步: 打開終端命令行,輸入:phantomjs,能夠進行到phantomjs命令行,則表示安裝成功在這裏插入圖片描述

推薦使用第一種配置環境變量方式


(2)可以選擇安裝有界面的鏡像


有界面和無界面的區別就是運行效率問題

下面以安裝有界面 chromedriver鏡像 爲例;你可以選擇任何瀏覽器的鏡像


安裝步驟:

  • 百度搜索chromedriver鏡像,版本號要選最接近的在這裏插入圖片描述在這裏插入圖片描述
  • 解壓後同樣放在anaconda/scripts下在這裏插入圖片描述

總結:到這裏我們的selenium和PhantomJS就安裝好了,我們可以使用他們來獲取動態數據


發佈了107 篇原創文章 · 獲贊 43 · 訪問量 7056
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章