越来越多的网站部署了反爬机制,导致数据抓取难度显著增加。常见的反爬手段主要包括动态加载、登录验证、IP 频率限制以及数据隐藏等。爬虫与反爬虫技术始终处于博弈状态,掌握有效的反反爬策略是数据工程师必备的技能。
一般网站主要从以下三个方面实施反爬:
本文探讨了常见的网站反爬机制及其对应的反反爬技术。主要涵盖三大方面:一是通过伪装 Headers(User-Agent、Referer、Cookie)规避基础检测;二是利用 IP 代理池和请求频率控制应对行为风控;三是针对动态页面采用 Selenium 自动化或分析 AJAX 接口。文章提供了 Python 代码示例,并强调了遵守法律法规及 robots.txt 协议的重要性,旨在帮助开发者安全高效地进行数据采集。

越来越多的网站部署了反爬机制,导致数据抓取难度显著增加。常见的反爬手段主要包括动态加载、登录验证、IP 频率限制以及数据隐藏等。爬虫与反爬虫技术始终处于博弈状态,掌握有效的反反爬策略是数据工程师必备的技能。
一般网站主要从以下三个方面实施反爬:
前两种最为常见,第三种多见于采用 AJAX 或 JavaScript 动态渲染的应用,增加了静态爬虫的难度。
Headers 是 HTTP 请求的重要组成部分,包含浏览器类型、操作系统、来源页面等信息。许多网站通过检测 User-Agent 和 Referer 来识别非浏览器流量。
User-Agent 标识了客户端身份。爬虫默认使用 Python 库的标识,容易被识别。解决方案是将 User-Agent 修改为主流浏览器的字符串。
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html[:500])
部分资源站(如图片、视频下载)会检查 Referer 字段,确保请求来自允许的域名。在代码中模拟正确的 Referer 值即可绕过。
某些网站需要携带特定的 Session ID 才能访问内容。可以通过 requests 库的 Session 对象自动管理 Cookie,保持会话状态。
import requests
session = requests.Session()
resp = session.get('https://example.com/login', data={'user': 'admin'})
# 后续请求会自动携带登录后的 Cookie
resp = session.get('https://example.com/profile')
网站服务器会监控 IP 地址的请求频率和账户操作行为。短时间内大量重复请求会导致 IP 被封禁或触发验证码。
使用代理 IP 可以有效分散请求来源。建议维护一个代理 IP 列表,每次请求随机切换。
import urllib.request
import random
proxy_list = [
'http://121.193.143.249:88',
'http://112.126.65.193:88',
'http://122.96.59.184:82'
]
proxy_url = random.choice(proxy_list)
proxy_support = urllib.request.ProxyHandler({'http': proxy_url})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
try:
response = urllib.request.urlopen('http://www.whatismyip.com.tw')
html = response.read().decode('utf-8')
print(html)
except Exception as e:
print(f'Error: {e}')
模拟人类操作,在请求之间加入随机延迟。避免固定时间间隔,可使用指数分布或正态分布生成随机等待时间。
import time
import random
for i in range(5):
# 随机等待 1 到 5 秒
time.sleep(random.uniform(1, 5))
# 执行请求逻辑
pass
对于强依赖登录的站点,单一账号极易被风控。准备多个账号并定期切换登录状态,可降低封号风险。
现代 Web 应用常通过 AJAX 异步加载数据,或通过 JavaScript 渲染 DOM。传统的 urllib 无法获取最终渲染后的 HTML。
通过浏览器开发者工具(F12)的 Network 面板,找到数据接口。直接调用 API 接口通常比解析 HTML 更高效且稳定。
Selenium 可以驱动真实浏览器,完全模拟用户操作,包括点击、滚动、输入等。配合无头模式(Headless)可提高效率。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
options = Options()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
time.sleep(3) # 等待页面加载
html = driver.page_source
driver.quit()
注:PhantomJS 已停止维护,建议使用 Chrome Headless 或 Playwright 等现代工具替代。
验证码是最后一道防线。简单的图形验证码可通过 OCR 识别,复杂验证码可能需要接入打码平台或人工服务。在开发阶段应尽量避免触碰此类高成本环节。
核心策略汇总:
法律风险提示:
爬虫技术本身无罪,但使用场景至关重要。请严格遵守目标网站的 robots.txt 协议,不得抓取个人隐私数据,不得干扰网站正常运营,不得用于非法牟利。技术学习应以提升效率为目的,切勿触碰法律红线。
进阶建议:
requests 库的高级用法,如重试机制、超时设置。Scrapy 框架,构建分布式爬虫系统。Playwright 等新工具,它们对现代 Web 框架支持更好。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online