爬蟲Scrapy-避免被禁止

在scrapy項目中,如何應對反爬蟲機制?

01-簡述主要方法

  1. 禁止Cookie
  2. 設置下載延遲時
  3. 使用IP池
  4. 使用用戶代理池
  5. 其他方法如進行分佈式爬取

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旗下的框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章