千家信息网

Python爬虫反反爬的策略有哪些

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Python爬虫反反爬的策略有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python爬虫反反爬的策略有哪些"吧!爬虫采集成为很多
千家信息网最后更新 2026年11月03日Python爬虫反反爬的策略有哪些

本篇内容主要讲解"Python爬虫反反爬的策略有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python爬虫反反爬的策略有哪些"吧!

爬虫采集成为很多公司企业个人的需求,但正因为如此,反爬虫的技术也层出不穷,像时间限制、IP限制、验证码限制等等,都可能会导致爬虫无法进行。所以以下是一些防止爬虫被反爬的几个主要策略。

  • 动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息,可以使用组件scrapy-random-useragent)

  • 禁用Cookies(对于简单网站可以不启用cookies middleware,不向Server发送cookies,有些网站通过cookie的使用发现爬虫行为)可以通过COOKIES_ENABLED 控制 CookiesMiddleware 开启或关闭

  • 启用Cookies(对于复杂网站,需要使用无头浏览器scrapy-splash获取js生成的复杂cookies

  • 设置延迟下载(防止访问过于频繁,设置为 2秒 或更高)

  • Google Cache 和 Baidu Cache:如果可能的话,使用谷歌/百度等搜索引擎服务器页面缓存获取页面数据。

  • Referer 使用假的来源,比如百度带关键词的链接

  • 使用IP地址池:现在大部分网站都是根据IP来ban的,可以通过亿牛云海量定制代理理池突破

  • 使用 亿牛云爬虫代理组件代码。

 #! -*- encoding:utf-8 -*-        import base64                    import sys        import random        PY3 = sys.version_info[0] >= 3        def base64ify(bytes_or_str):            if PY3 and isinstance(bytes_or_str, str):                input_bytes = bytes_or_str.encode('utf8')            else:                input_bytes = bytes_or_str            output_bytes = base64.urlsafe_b64encode(input_bytes)            if PY3:                return output_bytes.decode('ascii')            else:                return output_bytes        class ProxyMiddleware(object):                
def process_request(self, request, spider): # 代理服务器(产品官网 www.16yun.cn) proxyHost = "t.16yun.cn" proxyPort = "31111" # 代理隧道验证信息 proxyUser = "username" proxyPass = "password" request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort) # 添加验证头 encoded_user_pass = base64ify(proxyUser + ":" + proxyPass) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass # 设置IP切换头(根据需求) tunnel = random.randint(1,10000) request.headers['Proxy-Tunnel'] = str(tunnel)

修改项目配置文件 (./项目名/settings.py)

DOWNLOADER_MIDDLEWARES = {

'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,

'项目名.middlewares.ProxyMiddleware': 100,

}

设置下载中间件(Downloader Middlewares)

下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。

  1. 当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);

  2. 在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)

要激活下载器中间件组件,将其加入到 DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。

这里是一个例子:

DOWNLOADER_MIDDLEWARES = {    'mySpider.middlewares.MyDownloaderMiddleware': 543,}

编写下载器中间件十分简单。每个中间件组件是一个定义了以下一个或多个方法的Python类:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

  • 当每个request通过下载中间件时,该方法被调用。

  • process_request() 必须返回以下其中之一:一个 None 、一个 Response 对象、一个 Request 对象或raise IgnoreRequest:

    • 如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。

    • 如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的process_response() 方法则会在每个response返回时被调用。

    • 如果其返回 Request 对象,Scrapy则停止调用process_request方法并重新调度返回的request。当新返回的request被执行后,相应地中间件链将会根据下载的response被调用。

    • 如果其raise一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。

  • 参数:

    • request (Request 对象) - 处理的request

    • spider (Spider 对象) - 该request对应的spider

process_response(self, request, response, spider)

当下载器完成http请求,传递响应给引擎的时候调用

  • process_request() 必须返回以下其中之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。

    • 如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。

    • 如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。

    • 如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

  • 参数:

    • request (Request 对象) - response所对应的request

    • response (Response 对象) - 被处理的response

    • spider (Spider 对象) - response所对应的spider

使用案例:

1. 创建middlewares.py文件。

Scrapy代理IP、Uesr-Agent的切换都是通过DOWNLOADER_MIDDLEWARES进行控制,我们在settings.py同级目录下创建middlewares.py文件,包装所有请求。

# middlewares.py#!/usr/bin/env python# -*- coding:utf-8 -*-import randomimport base64from settings import USER_AGENTSfrom settings import PROXIES# 随机的User-Agentclass RandomUserAgent(object):    def process_request(self, request, spider):        useragent = random.choice(USER_AGENTS)        request.headers.setdefault("User-Agent", useragent)class RandomProxy(object):    def process_request(self, request, spider):        proxy = random.choice(PROXIES)        if proxy['user_passwd'] is None:            # 没有代理账户验证的代理使用方式            request.meta['proxy'] = "http://" + proxy['ip_port']        else:            # 对账户密码进行base64编码转换            base64_userpasswd = base64.b64encode(proxy['user_passwd'])            # 对应到代理服务器的信令格式里            request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd            request.meta['proxy'] = "http://" + proxy['ip_port']

为什么HTTP代理要使用base64编码:

HTTP代理的原理很简单,就是通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过,就这么简单,下面是具体的信令格式:

CONNECT 59.64.128.198:21 HTTP/1.1Host: 59.64.128.198:21Proxy-Authorization: Basic bGV2I1TU5OTIzUser-Agent: OpenFetion

其中Proxy-Authorization是身份验证信息,Basic后面的字符串是用户名和密码组合后进行base64编码的结果,也就是对username:password进行base64编码。

HTTP/1.0 200 Connection established

OK,客户端收到收面的信令后表示成功建立连接,接下来要发送给远程主机的数据就可以发送给代理服务器了,代理服务器建立连接后会在根据IP地址和端口号对应的连接放入缓存,收到信令后再根据IP地址和端口号从缓存中找到对应的连接,将数据通过该连接转发出去。

2. 修改settings.py配置USER_AGENTS和PROXIES

  • 添加USER_AGENTS:

USER_AGENTS = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"]
  • 添加代理IP设置PROXIES:

代理IP可以购买亿牛云的爬虫代理IP:

PROXIES = [    {'ip_port': 't.16yun.cn:31111', 'user_passwd': '16yun:16yun'},    {'ip_port': 't.16yun.cn:31112', 'user_passwd': '16yun:16yun'}]
  • 除非特殊需要,禁用cookies,防止某些网站根据Cookie来封锁爬虫。COOKIES_ENABLED = False

  • 设置下载延迟DOWNLOAD_DELAY = 3

  • 最后设置setting.py里的DOWNLOADER_MIDDLEWARES,添加自己编写的下载中间件类。

DOWNLOADER_MIDDLEWARES = {            #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,        'mySpider.middlewares.RandomUserAgent': 1,        'mySpider.middlewares.ProxyMiddleware': 100    }

到此,相信大家对"Python爬虫反反爬的策略有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

中间件 代理 对象 爬虫 方法 处理 验证 服务器 服务 信令 信息 网站 引擎 组件 编码 主机 代码 口号 地址 数据 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司 互联网科技巨头监管 互联网电商科技 麻工互联网科技 安控科技rtu产品工业互联网 成都玖崟互联网科技有限公司乐商圈怎么样 青岛中康互联网医疗科技有限公司 互联网科技博主是什么意思 湖南诚度互联网科技有限公司 厦门比较好的科技互联网公司 玉溪互联网科技怎么选 乌苏新华互联网科技做什么的 长沙茂晟互联网科技有限公司 伍佰万互联网科技怎么赚钱 雨阳互联网卡科技有限公司 互联网安防科技感 互联网科技融合创新 广州燕处互联网科技有限公司 全球科技与互联网公司市值变化 承德科技产业互联网平台 科技互联网项目 互联网和科技创新 喔噻互联网科技 迪茉互联网科技 郑州华宇互联网科技 恒生科技互联网指数分析 移动互联网年度科技创新 呼和浩特新华互联网科技学院 北京互联网科技类企业分布 青岛互联网科技园
0