Python案例中的爬虫如何防屏蔽?

wen python案例 2

Python爬虫防屏蔽实战指南:突破反爬虫机制的10大核心策略

目录导读

  1. 爬虫被屏蔽的常见现象与原因分析
  2. 基础防屏蔽:User-Agent与请求头伪装
  3. IP代理池:破解IP封锁的核心方案
  4. 请求频率控制:模拟人类访问节奏
  5. Cookie与Session管理:维持登录状态
  6. JavaScript渲染内容处理:Selenium与Playwright
  7. 验证码识别与绕过策略
  8. 高难度反爬:指纹识别与动态令牌
  9. 实战问答:常见爬虫防屏蔽场景解析
  10. 总结与合规建议

爬虫被屏蔽的常见现象与原因分析

现象表现

Python案例中的爬虫如何防屏蔽?

  • 返回状态码403、429、418(如“I'm a teapot”)
  • 返回空数据或HTML验证页面(如“您访问过于频繁”)
  • 请求被重定向到验证码页面
  • 获取的数据为无意义乱码(数据混淆)

核心原因

  • 请求头缺失或异常:多数网站通过检查User-Agent、Referer等字段识别爬虫
  • IP请求频率过高:单个IP在短时间内大量请求触发封禁
  • 缺乏浏览器环境模拟:大量网站依赖JavaScript动态渲染,纯HTTP请求无法获取真实数据
  • 访问行为模式化:固定间隔、固定路径、无鼠标轨迹等机器人特征

基础防屏蔽:User-Agent与请求头伪装

原理:模仿真实浏览器发送的HTTP请求头信息,避免被服务器标记为爬虫。

Python实现代码

import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {
    'User-Agent': ua.random,
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://www.example.com/',
    'Connection': 'keep-alive'
}
response = requests.get('https://target.com', headers=headers, timeout=10)

关键技巧

  • 使用fake_useragent库随机切换UA,避免重复使用同一UA
  • 添加Referer字段模拟从本站或搜索引擎跳转
  • 使用requests.Session()保持连接,减少重新握手的异常特征

IP代理池:破解IP封锁的核心方案

原理:通过代理服务器轮换出口IP,分散请求来源,绕过IP频率限制。

实现步骤

  1. 获取代理IP:可从免费代理网站(如快代理、西刺代理)或付费服务(如太阳代理、芝麻代理)获取
  2. 验证代理可用性:测试连接速度与匿名性
  3. 动态切换:设置请求错误时自动更换代理

高级方案

import random
import requests
from itertools import cycle
proxy_pool = [
    'http://user:pass@ip1:port',
    'http://ip2:port',
    'http://ip3:port'
]
proxy_cycle = cycle(proxy_pool)
def fetch_with_proxy(url):
    proxy = next(proxy_cycle)
    try:
        response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=5)
        if response.status_code == 200:
            return response
        else:
            proxy_cycle = cycle([p for p in proxy_pool if p != proxy])  # 移除失效代理
            return fetch_with_proxy(url)
    except Exception:
        return fetch_with_proxy(url)

注意事项

  • 免费代理稳定性差,需大量验证后使用
  • 建议每个代理绑定固定请求次数(如10次)后强制切换
  • 优先使用高匿名HTTP/HTTPS代理,避免透明代理暴露真实IP

请求频率控制:模拟人类访问节奏

核心逻辑:不固定的时间间隔 + 随机等待 + 请求分布策略

实战代码

import time
import random
def controlled_request(url, session, min_delay=1.0, max_delay=5.0):
    delay = random.uniform(min_delay, max_delay)
    time.sleep(delay)  # 随机等待1-5秒
    response = session.get(url)
    # 模拟鼠标滚动行为(可选)
    # scroll_human_like()
    return response

增强策略

  • 多任务随机化:使用asynciothreading并发时,设置每个线程独立的延迟范围
  • 页面深度模拟:先访问首页,再随机点击导航链接进入内页,而非直接请求目标URL
  • 请求时间分布:避开高峰期(如中国晚8-10点),模拟用户白天正常访问

Cookie与Session管理:维持登录状态

场景:需登录才能获取数据的网站(如电商后台、社交媒体)

操作流程

  1. 使用requests.Session()对象自动处理Cookie
  2. 登录时通过POST提交用户名密码,或使用Selenium手动登录后提取Cookie
  3. 将Cookie序列化存储,后续请求直接加载

代码示例

import requests
import pickle
session = requests.Session()
# 登录
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://example.com/login', data=login_data)
# 保存Cookie
with open('cookies.pkl', 'wb') as f:
    pickle.dump(session.cookies, f)
# 后续请求加载Cookie
with open('cookies.pkl', 'rb') as f:
    session.cookies.update(pickle.load(f))
response = session.get('https://example.com/dashboard')

注意:Cookie有效期有限,需定期更新;部分网站对Cookie中的session_id进行动态校验,需同时处理Session对象。


JavaScript渲染内容处理:Selenium与Playwright

问题:越来越多网站使用React、Vue等框架动态生成内容,纯requests获取为空白页面。

解决方案

使用Selenium(轻量级)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')  # 无头模式
options.add_argument('--disable-blink-features=AutomationControlled')  # 隐藏自动化特征
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
time.sleep(3)  # 等待JS加载
page_source = driver.page_source
driver.quit()

使用Playwright(更现代高效)

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    context = browser.new_context(
        user_agent='Mozilla/5.0...',
        viewport={'width': 1920, 'height': 1080}
    )
    page = context.new_page()
    page.goto('https://example.com', wait_until='networkidle')
    page.wait_for_selector('.product-item')  # 等待特定元素
    html = page.content()
    browser.close()

关键优化

  • 添加--disable-web-security参数绕过CORS检查
  • 使用page.add_init_script()注入navigator.webdriver=false防止被检测
  • 设置合理的等待策略:DOM元素出现、网络空闲或自定义时间

验证码识别与绕过策略

常见类型

  • 字符验证码(文本扭曲)
  • 图形验证码(点击特定区域)
  • 滑动验证码(如极验、阿里云盾)
  • 无感验证码(行为分析)

处理方式

验证码类型 推荐方案 适用程度
简单字符验证码 OCR(Tesseract + 图像预处理) 低安全性
复杂字符验证码 第三方打码平台(如超级鹰、2Captcha) 中高成本
滑动验证码 模拟人类拖拽轨迹(Selenium ActionChains) 需调试
行为验证码 降低请求频率 + 使用真人IP + 延迟处理 最安全

滑动验证码实现示例

from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
# 定位滑块元素
slider = driver.find_element(By.CLASS_NAME, 'slider-btn')
# 模拟人类慢速拖拽
action = ActionChains(driver)
action.click_and_hold(slider)
for i in range(50):
    action.move_by_offset(5, random.randint(-2, 2))
    time.sleep(0.01)
action.release().perform()

高难度反爬:指纹识别与动态令牌

前端指纹检测

  • Canvas指纹:浏览器渲染差异
  • WebGL指纹:显卡信息
  • 字体指纹:操作系统字体列表
  • 屏幕分辨率、时区、语言等

对抗手段

  1. 指纹随机化:使用playwrightpuppeteer-extra插件,每次启动新浏览器实例重新生成指纹
  2. 注入伪造数据:通过page.evaluate()修改navigatorscreendocument等属性
  3. 多用户环境隔离:为每个爬虫任务创建独立的profile目录

动态令牌处理

  • 分析前端JavaScript,找到令牌生成逻辑(如时间戳+加密+签名)
  • 使用pyexecjsjs2py执行JS代码模拟生成
  • 或直接用浏览器渲染获取最终令牌

实战问答:常见爬虫防屏蔽场景解析

Q1:爬取京东商品详情时,为什么返回空白页?

A:京东大量使用JavaScript异步加载数据,需使用Selenium或Playwright,同时需添加合理请求头,禁用navigator.webdriver标记,建议先在浏览器正常访问,观察Network请求,找到真实数据接口(如item.jd.com/jq/...)直接请求该接口可能更高效。

Q2:如何解决爬取知乎时频繁出现“请登录”提示?

A:知乎对未登录用户有严格频率限制,需先通过Selenium手动登录,导出Cookie,设置session.cookies,同时使用固定UA(不要随机切换)并模拟用户浏览行为:停留3-5秒后点击下一页,而非直接翻页。

Q3:使用了代理池,为什么还是被封?

A:可能原因:

  • 代理质量低(透明代理暴露真实IP)
  • 请求头不完整(缺少Accept-Language等)
  • 并发数过高(建议单代理同时请求≤2)
  • 目标网站对特定CDN区域(如国内代理访问海外站点)限制

Q4:怎样绕过Cloudflare的5秒盾保护?

A:Cloudflare通过JavaScript挑战验证浏览器环境,推荐方案:

  1. 使用cloudscraper库(基于requests+模拟浏览器挑战)
  2. 使用Playwright的无头模式并设置--disable-web-security
  3. 付费代理+低频率请求(通常可缓解)

总结与合规建议

核心要点回顾

  • 分层防御:从最基本的请求头伪装,到IP代理、频率控制、浏览器渲染、验证码绕过,需逐层叠加
  • 动态策略:没有固定不变的方案,需根据目标网站的反爬升级随时调整
  • 成本权衡:免费方法不稳定,付费代理+第三方验证码识别是商业爬虫的主流选择

合规红线

  1. 遵守目标网站的robots.txt规则,禁止爬取明确禁止的路径
  2. 控制爬取频率,避免对服务器造成压力(每秒请求数低于1次)
  3. 不爬取用户隐私数据(如姓名、手机号、密码)
  4. 商业用途前务必获取授权

工具推荐

  • 小型爬虫:requests + lxml(静态)+ Selenium/Playwright(动态)
  • 大型爬虫:scrapy + scrapy-playwright + scrapy-rotating-proxies
  • 监控预警:使用notiontelegram bot实时报告封禁状态

最后提示:反爬与防反爬是持续的攻防博弈,当发现单纯的技术策略失效时,不妨回归商业逻辑:通过官方API、数据合作、或者直接购买数据服务,往往比暴力破解更高效且合法。

抱歉,评论功能暂时关闭!