1.反爬蟲措施一般分為四類:
①基于驗證碼的反爬蟲:傳統驗證碼、邏輯驗證碼、滑動驗證碼、google訪問時彈出的驗證碼
②基于Headers的反爬蟲:常用的是User-Agent字段、Referer字段。
③基于用戶行為的反爬蟲:
a. 同一個IP短時間多次訪問同一頁面→使用大量IP代理進行繞過;
b. 同一賬戶短時間多次進行相同操作→注冊較多的賬戶登陸,構成一個cookie池,對用戶狀態進行自動切換;
c. 訪問頁面的間隔比較固定,不像人在訪問→將訪問間隔設置成隨機,盡可能模擬人的訪問頻率;
④基于動態頁面的反爬蟲:
a.頁面使用Ajax動態加載→需要分析Ajax請求,然后進行模擬發送獲取數據
b.Ajax請求的所有參數全部加密,無法構造所需數據的請求→ 使用selenium+phantomJS(缺點:較低的效率和較大的內存消耗)
爬蟲和反爬蟲的斗爭中,最終必然是爬蟲勝利,只不過是付出多大的代價而已。
2.在scrapy中推薦的突破反爬蟲措施(也適用于普通爬蟲程序):
①動態User-Agent池(偽裝存在很多用戶)
可使用下載器中間件RandomUserAgent, 設置動態的User-Agent。使用時在settings.py中將內置的UserAgentMiddleware禁用,并激活RandomUserAgent即可。
## 用于產生隨機的User-Agent
import random
class RandomUserAgent(object):
def __init__(self, agents):
self.agents = agents
@classmethod
def from_crawler(cls, crawler):
# 從Settings.py中加載USER-AGENTS的值
return cls(crawler.settings.getlist('USER-AGENTS'))
def process_request(self, request, spider):
# 在process_request中設置User-Agent的值
request.headers.setdefault('User-Agent': random.choice(self.agents))
②禁用cookies
如果登陸的網站不需要登陸就可以進行爬取,可以嘗試將Cookies禁用,因為Cookies會跟蹤爬蟲的訪問過程,容易被發現。
禁用Cookies的設置方法:settings.py中→ COOKIES_ENABLED=False
③設置下載延時與自動限速
settings.py中→
DOWNLOAD_DELAY = 2 #下載延時
RANDOMIZE_DOWNLOAD_DELAY = True #延遲時間=(隨機值0.5-1.5)*DOWNLOAD_DELAY
但有一些網站會檢測訪問延遲的相似性,也有被發現的可能性,此時可以使用scrapy提供的自動限速擴展方法,此擴展能根據Scrapy服務器以及爬取的網站的負載自動限制爬取速度。
④代理IP池
⑤Tor代理
⑥分布式下載器:Crawlera
⑦Google cache