在scrapy項目中,如何應對反爬蟲機制?
01-簡述主要方法
- 禁止Cookie
- 設置下載延遲時
- 使用IP池
- 使用用戶代理池
- 其他方法如進行分佈式爬取
02-禁止Cookie
原理:網站會通過Cookie信息對用戶進行識別和分析,此時如果我們禁止本地Cookie信息讓對方網站無法識別出我們的會話信息。
------settings
COOKIES_ENABLED = False
03-設置下載延遲
原理:網站會通過我們對網頁的訪問頻率進行分析,此時我們只需要控制一下爬行的時間間隔。
------settings
DOWNLOAD_DELAY = 3
#3代表3秒
04-設置IP池
- 原理:網站會對用戶的IP進行檢測,如果同意IP在短時間內對自己服務器上的頁面進行大量爬去,就可以封其IP。
- 破解:利用不同代理服務器可以獲取不同的IP,此時我們可以獲取多個代理服務器,將這些代理服務器的IP組成一個IP池,每次爬取網頁時可以隨機選取IP池中的一個IP進行爬取。
- 操作:在Scrapy項目中建立一個下載的中間件,在下載的中間件中設置好IP選擇規則,在settings.py設置中配置好下載的中間件,並配置好IP池。
#第一步創建中間件文件
cd 文件夾
echo #>middlewares.py
#第二步編輯settings的IP代理池(http://yum.iqianyue.com/proxy)
------settings通過字典形式儲存。
IPPOOL=[
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
]
#第三步編輯中間件文件
import random
from qianmu.settings import IPPOOL
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
class IPPOOLS(HttpProxyMiddleware):
def __init__(self,ip=''):
self.ip = ip
def process_request(self, request, spider):
thisip = random.choice(IPPOOL)
request.meta["proxy"] = "http://"+thisip["ipaddr"]
#第四步更改默認的下載中間件爲我們自己寫的中間件---settings
默人
#DOWNLOADER_MIDDLEWARES = {
# 'qianmu.middlewares.MyCustomDownloaderMiddleware': 543,
#}
改爲
DOWNLOADER_MIDDLEWARES = {
#'qianmu.middlewares.MyCustomDownloaderMiddleware': 543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123,
'myfirstpjt.middlewares.IPPOOLS':125
}
05-使用用戶代理池
- 原理:網站服務器分析用戶信息。
- 破解:同上
# 01-設置用戶代理池
UPPOOL = [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
# 02-創建下載中間文件uamid.py(與settings.py同一個目錄)
# -*- coding: utf-8 -*-#
# 導入隨機模塊
import random
# 導入settings文件中的UPPOOL
from .settings import UPPOOL
# 導入官方文檔對應的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
class Uamid(UserAgentMiddleware):
# 初始化 注意一定要user_agent,不然容易報錯
def __init__(self, user_agent=''):
self.user_agent = user_agent
# 請求處理
def process_request(self, request, spider):
# 先隨機選擇一個用戶代理
thisua = random.choice(UPPOOL)
print("當前使用User-Agent是:"+thisua)
request.headers.setdefault('User-Agent',thisua)
#03-在settings.py中配置下載中間件
# 配置下載中間件的連接信息
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
配置文件:
# 設置IP池和用戶代理
# 禁止本地Cookie
COOKIES_ENABLED = False
# 設置IP池
IPPOOL = [
{"ipaddr": "221.230.72.165:80"},
{"ipaddr": "175.154.50.162:8118"},
{"ipaddr": "111.155.116.212:8123"}
]
# 設置用戶代理池
UPPOOL = [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
# 配置下載中間件的連接信息
DOWNLOADER_MIDDLEWARES = {
#'scrapy.contrib.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
#'modetest.middlewares.IPPOOlS' : 125,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
06-其他方法
例如使用谷歌的cache,使用分佈式爬蟲中常見的scrapinghub旗下的框架