爬虫Scrapy-避免被禁止

时间:2022-07-01 20:13:44

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