【Python必學】Python爬蟲反爬策略你確定不會吧?

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。

正文html

Python爬蟲反爬策略三部曲,擁有這三步曲就能夠在爬蟲界立足了:瀏覽器

  1. 瀏覽器假裝
  2. IP代理池和用戶代理池構建
  3. 動態頁面加載解決方法
    注意:若是你Python基礎不夠紮實,建議先學好再來,缺Python最新教程的能夠點擊下方連接自行獲取
    http://note.youdao.com/noteshare?id=a3a533247e4c084a72c9ae88c271e3d1

網站反爬機制經常使用的方法:服務器

一、經過識別訪問的headers來判斷是爬蟲仍是瀏覽器訪問,其中最經常使用和最重要的就是User-Agent用戶代理,服務器能夠從這個字段識別出客戶端瀏覽器類型和版本號、客戶端的操做系統,頁面排版等信息,正是由於這個緣由手機和電腦打開的同個網站的頁面的排版是不一樣的,經常使用的還有Referer等字段;cookie

二、經過用戶行爲,要是經過一個IP短期內大量訪問數據,該網站可能對這個IP進行短期的禁止訪問,這個能夠增長訪問延時時間,好比每訪問一次延時time.sleep(5),延時5秒,要是爬取的數據量大的話這個爬取時間是挺蛋疼的,最好的方法就是同時構建用戶代理池和IP代理池,每訪問幾回就換一個用戶代理和IP代理就完美解決了;網絡

三、動態頁面加載,能夠經過抓包分析出頁面加載的規律而後構造批量請求,若是文件是加密的,可使用selenium+phantomJS瀏覽器內核來訪問,這個是真實的用戶行爲,速度比較慢,能夠瀏覽器操做的部分交給selenium+phantomJS,爬取的功能交給爬蟲實現,雖然比純爬蟲慢,可是也沒辦法了。函數

先來第一部曲學習

瀏覽器假裝網站

  • 經過Request添加headers
  • 經過Opener添加headers
  • 批量添加headers

經過Request添加headersui

  1.  
    import urllib.request
  2.  
    url= "https://qiushibaike.com"
  3.  
    headers={ "User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
  4.  
    WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36"}
  5.  
    req=urllib.request.Request(url,headers=headers)
  6.  
    #對request進行封裝
  7.  
    data=urllib.request.urlopen(req).read().decode( "utf-8","ignore")

經過Opener添加headers加密

基本的urlopen()函數不支持驗證、cookie或其餘HTTP高級功能,要支持這些功能必須使用build_opener()函數來建立本身的自定義Opener對象

install_opener(opener)安裝opener做爲urlopen()使用的全局URL opener,即意味着之後調用urlopen()時都會使用安裝的opener對象。

  1.  
    import urllib.request
  2.  
    url= "https://www.qiushibaike.com/"
  3.  
    headers=( "User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
  4.  
    WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36")
  5.  
    opener=urllib.request.build_opener()
  6.  
    opener.addheaders=[headers]
  7.  
    data=opener.open(url).read()
  8.  
    #使用自定義的假裝瀏覽器進行訪問
  9.  
    urllib.request.install_opener(opener)
  10.  
    data=urllib.request.urlopen(url).read().decode( "utf-8","ignore")
  11.  
    #也能夠安裝爲全局,意味着之後調用urlopen()函數都會使用安裝的opener對象

經過批量添加headers

  1.  
    import urllib.request
  2.  
    url= "https://qiushibaike.com"
  3.  
    headers={
  4.  
    "User-Agent":"Mozilla/5.0 (Windows NT6.1; WOW64) Apple\
  5.  
    WebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.92 Safari/537.36",
  6.  
    "Referer":"https://qiushibaike.com"
  7.  
    }
  8.  
    #這裏只是作一個演示,能夠添加更多的字段,有些字段是不用的,有些字段是要的,這個能夠進行抓包分析請求需求
  9.  
    opener=urllib.request.build_opener()
  10.  
    headerall=[]
  11.  
    for key,value in headers.item():
  12.  
    item=(key,value)
  13.  
    headerall.apend(item)
  14.  
    #[("",""),("","")] 遍歷存儲之後的形式
  15.  
    opener.addheaders=headersall
  16.  
    urllib.request.install_opener(opener)
  17.  
    data=urllib.request.urlopen(url).read().decode( "utf-8","ignore")

瀏覽器假裝能夠解決大部分網站的反爬機制,大型網站反爬機制就比較複雜點了,後面更新構建IP代理和用戶代理,動態頁面加載的解決方法

相關文章
相關標籤/搜索