Python案例如何防止爬虫封禁?

wen python案例 27

本文目录导读:

Python案例如何防止爬虫封禁?

  1. 伪造请求头(最基本的伪装)
  2. 控制请求频率(最有效的反封策略)
  3. 使用代理IP(突破IP级封禁)
  4. 处理Cookies和Session(避免被“记住”)
  5. 抓取内容的“痕迹”处理(应对反爬JS验证)
  6. 处理验证码(最头疼的问题)
  7. 模拟鼠标和键盘操作(破解行为分析)
  8. 使用专业的反爬绕过库(一键集成)
  9. 总结:一套可执行的“反封”流程
  10. 最终建议

防止爬虫被封禁的核心原则是模拟真实用户行为,而不是让服务器觉得你在“扫荡”,以下是Python爬虫开发中常用的8个实战策略,从基础到进阶:

伪造请求头(最基本的伪装)

原因:服务器会检测 User-AgentReferer 等字段,Python的 requests 默认UA会被一眼识别。

代码

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,en;q=0.6',
    'Referer': 'https://www.google.com/',  # 模拟从搜索引擎跳转
    'Connection': 'keep-alive',
}

进阶技巧:维护一个UA池,每次随机选择一个,避免单一UA被拉黑。

import random
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
    'Mozilla/5.0 (X11; Linux x86_64) ...',
]
headers['User-Agent'] = random.choice(user_agents)

控制请求频率(最有效的反封策略)

原因:瞬时大量请求会触发服务器的限流机制(如429 Too Many Requests)。

代码

import time
import random
# 每个请求之间随机休眠1~3秒
time.sleep(random.uniform(1, 3))

高级做法:使用指数退避(Exponential Backoff),遇错时暂停时间递增:

def request_with_retry(url, max_retries=3):
    for i in range(max_retries):
        try:
            return requests.get(url, headers=headers, timeout=5)
        except Exception as e:
            wait = (2 ** i) + random.random()
            time.sleep(wait)
            continue

使用代理IP(突破IP级封禁)

原因:同IP多次请求容易被封,尤其对于反爬严格的网站。

代码

import requests
proxy = {
    'http': 'http://10.10.1.10:3128',   # 这种通常需要购买付费代理
    'https': 'http://10.10.1.10:1080',
}
# 付费代理池(如快代理、芝麻代理)会自动轮换IP
response = requests.get('https://example.com', proxies=proxy, headers=headers)

实战建议:直接使用付费代理API会更省心,免费代理不稳定且易被污染。


处理Cookies和Session(避免被“)

原因:有些网站会根据Cookie跟踪你的行为,如果第一次请求没有Cookie,第二次突然换了,可能会被标记。

做法:使用 requests.Session() 自动管理Cookie。

session = requests.Session()
# 先访问首页获取Cookie
session.get('https://example.com', headers=headers)
# 后续请求会自动携带Cookie
response = session.get('https://example.com/data', headers=headers)

的“痕迹”处理(应对反爬JS验证)

原因:部分网站会检测浏览器是否运行了JavaScript(如加密参数、鼠标轨迹)。

工具

  • Selenium / Playwright:模拟真实浏览器环境,但速度慢且耗资源。
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://example.com')
    driver.implicitly_wait(5)  # 等待页面JS渲染
  • DrissionPage:结合requests速度和selenium功能,更轻量。

处理验证码(最头疼的问题)

方案优先级

  1. 绕过:使用 adblock 插件拦截验证码脚本(如Cloudflare的turnstile)。
  2. 识别:使用 pytesseract(简单图形验证码)或付费打码平台(如超级鹰)。
  3. 人工介入:当概率低时,保留失败请求,等待人工处理。

模拟鼠标和键盘操作(破解行为分析)

场景:网站检测“点击频率”、“滚动速度”。

Selenium 模拟

from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.move_to_element(element).perform()  # 悬停
actions.click().perform()

使用专业的反爬绕过库(一键集成)

GitHub 经典项目

  • fake-useragent:自动生成随机、真实的User-Agent
    from fake_useragent import UserAgent
    ua = UserAgent()
    headers = {'User-Agent': ua.random}
  • requests-html:支持解析JavaScript,比纯requests更方便
  • cloudscraper:专门绕过Cloudflare的防护
    import cloudscraper
    scraper = cloudscraper.create_scraper()
    response = scraper.get('https://site-protected-by-cloudflare.com')

一套可执行的“反封”流程

import time
import random
import requests
from fake_useragent import UserAgent
ua = UserAgent()
session = requests.Session()
# 配置代理(可选)
proxies = {'http': 'http://your_proxy:port'}
def safe_request(url, retries=3):
    for i in range(retries):  # 重试机制
        try:
            # 1. 随机UA
            headers = {'User-Agent': ua.random}
            # 2. 模拟浏览器常见附加头
            headers['Accept-Language'] = 'en-US,en;q=0.9'
            # 3. 使用Session保持Cookie
            response = session.get(url, headers=headers, proxies=proxies, timeout=10)
            # 4. 检测状态码
            if response.status_code == 200:
                return response
            elif response.status_code == 429:  # 请求过多
                wait = 2 ** i + random.random()
                time.sleep(wait)
            else:
                time.sleep(2)
        except Exception as e:
            time.sleep(3)
    return None
# 5. 每个请求间随机延迟
time.sleep(random.uniform(1, 3))
data = safe_request('https://example.com')

最终建议

  1. 先观察再动手:抓包分析网站的反爬机制(如Cookie有效期、AJAX请求参数)。
  2. 尊重robots.txt:纯道德层面,但很多网站会据此封IP。
  3. 优先选择API接口:如果网站有官方API,优先使用,这是最合法的方式。

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