嘿,大家好,我是4U。目前當下很多行業都需要爬大資料來分析行業資料或者產品資料,當然是離不開爬大資料來分析的啦。大家在使用“爬蟲”爬資料的時候是否有發現,越來越多的網站都有自己的反爬機制,抓取資料已經不像以前那麼容易獲取了,目前常見的反爬機制主要有以下幾種:
囑咐大家一句,爬蟲世界確實很有意思,技術是無罪的,學習是可以的,但還是實際操作就要適可而止了,不要觸碰到法律的邊界線。
此內容僅供學習交流,請勿因個人意願和舉動觸碰到法律的邊界線,文明學習技術,請勿擾亂網路安全。
資料是透過動態載入的,比如某博,某日頭條,某站,某音,某紅書等等
需要登入,需要驗證碼,比如鐵路12306,某寶,某東,某品會。
請求次數頻繁,IP地址在同一時間訪問次數過多,導致IP被冰封~
資料遮蔽方式,比如訪問的資料不在原始碼中,資料隱藏在js中,比如今日分享,b站
網站為什麼要設定反爬機制?有兩個原因,一是為了保護網站安全,減輕伺服器壓力,另一個原因則是為了保護網站資料安全。
爬蟲技術者與反爬技術者一直以來就像是左右手互博,你有反爬機制,我就有反反爬技術,即見即可爬,道高一尺魔高一丈。
今天為大家詳細介紹網站的反爬蟲機制和實用的應對方法,一般網站從三個方面反爬蟲:
- 1.使用者請求的Headers
- 2.使用者行為
- 3.網站目錄和資料載入方式
前兩種比較容易遇到,大多數網站都從這些角度來反爬蟲。第三種一些應用ajax的網站會採用,這樣增大了爬取的難度(防止靜態爬蟲使用ajax技術動態載入頁面)。
1、從使用者請求的Headers反爬蟲。
這種是最常見的反爬機制,在訪問某些網站的時候,網站通常會用判斷訪問是否帶有標頭檔案來鑑別該訪問是否為爬蟲,用來作為反爬取的一種策略。
那我們就需要偽裝headers。很多網站都會對Headers的User-Agent進行檢測,還有一部分網站會對Referer進行檢測(一些資源網站的防盜鏈就是檢測Referer)。
如果遇到了這類反爬蟲機制,可以直接在爬蟲中新增Headers,將瀏覽器的User-Agent複製到爬蟲的Headers中;或者將Referer值修改為目標網站域名。
如圖,訪問頭資訊中顯示了瀏覽器以及系統的資訊(headers所含資訊眾多,其中User-Agent就是使用者瀏覽器身份的一種標識,具體可自行查詢)
Python中urllib中的request模組提供了模擬瀏覽器訪問的功能,程式碼如下:
- from urllib import request
- url = http://www. baidu.com
- # page= requestRequest (url)
- # page add header (' User-Agent',' Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebki
- headers ={'User-Agent': ' Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebkit/537. 36'}
- page = request Request(url, headersheaders)
- page_info = request urlopen(page). read().decode('utf-8')
- print(page_info)
可以透過<code>add_header(key, value)</code> 或者直接以引數的形式和URL一起請求訪問
- urllib.request Request()
- urllib.request Request(url, data=None, headers={}, origin req host=None, unverifiable )
其中headers是一個字典,透過這種方式可以將爬蟲模擬成瀏覽器對網站進行訪問。
2、基於使用者行為反爬蟲
還有一部分網站是透過檢測使用者行為,例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。
這種防爬,需要有足夠多的ip來應對。
(1)大多數網站都是前一種情況,對於這種情況,使用IP代理就可以解決。可以專門寫一個爬蟲,爬取網上公開的代理ip,檢測後全部儲存起來。有了大量代理ip後可以每請求幾次更換一個ip,這在requests或者urllib中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
編寫爬蟲代理:
步驟:
引數是一個字典{‘型別’:‘代理ip:埠號’}<br> proxy_support=urllib.request.ProxyHandler({})
定製、建立一個openeropener=urllib.request.build_opener(proxy_support)
安裝opener
urllib.request.install_opener(opener)
呼叫opener
opener.open(url)
用大量代理隨機請求目標網站,應對爬蟲攻擊
- import urllib request
- import random
- import re
- url='http://www. whatismyip. com. tw '
- iplist=['121.193.143.249:88',"112.126.65.193:88',122.96.59.184:82',115.29.98.139:9]
- proxy_support = urllib. request Proxyhandler({'httP': random choice(iplist)})
- opener = urllib.request.build_opener(proxy_suppor)
- opener.addheaders=[(' User-Agent, ' Mozilla/5.0(X11; Linux x86-64) AppleWebkit/537.36'
- urllib.request.install_opener(opener)
- response = urllib.request.urlopen(url)
- html = response.read().decode(' utf-8)
- pattern = re.compile('<h1>(.*?)</h1>.*?<h2>(,*?)</h2>')
- iterms=re.findall(pattern, html)
- for item in iterms:
- print(item[0]+:"+item[1])
(2)對於第二種情況,可以在每次請求後隨機間隔幾秒再進行下一次請求。有些有邏輯漏洞的網站,可以透過請求幾次,退出登入,重新登入,繼續請求來繞過同一賬號短時間內不能多次進行相同請求的限制。
對於賬戶做防爬限制,一般難以應對,隨機幾秒請求也往往可能被封,如果能有多個賬戶,切換使用,效果更佳。
3、動態頁面的反爬蟲
上述的幾種情況大多都是出現在靜態頁面,還有一部分網站,我們需要爬取的資料是透過ajax請求得到,或者透過Java生成的。
解決方案:Selenium+PhantomJS
Selenium:自動化web測試解決方案,完全模擬真實的瀏覽器環境,完全模擬基本上所有的使用者操作
PhantomJS :一個沒有圖形介面的瀏覽器
比如獲取某寶的個人詳情地址:
- from selenium import webdriver
- import time
- import re
- drive = webdriver.PhantomJs(executable_path = ' phantomjs-21.1-linux-x86 64/bin/phanto drive.get('https://mm. taobaocom/self/modelinfohtm? userid=189942305& iscoment=fal)
- time. sleep(5)
- pattern = re.compile(r'<div. *? mm-p-domain-info>*? class="mm-p-info-cell clearfix">.
- html = drive.page_source.encode(' utf-8,' ignore')
- items=re.findall(pattern, html)
- for item in items:
- print(item[0], 'http':+item[1])
- drive.close()
4.總結
最後給大家總結一下前面所講的反爬機制應對策略(反爬):
- 偽裝瀏覽器
- 使用代理IP
- 抓包分析突破非同步載入 / selenium自動化測試工具
- 新增cookie
