
本文详解为何传统 beautifulsoup 解析无法获取被 cloudflare 邮箱保护(email obfuscation)机制隐藏的邮箱,以及如何通过解析嵌入式 json 数据(__next_data__)精准提取结构化代理信息,包括真实邮箱、姓名、位置和官网。
本文详解为何传统 beautifulsoup 解析无法获取被 cloudflare 邮箱保护(email obfuscation)机制隐藏的邮箱,以及如何通过解析嵌入式 json 数据(__next_data__)精准提取结构化代理信息,包括真实邮箱、姓名、位置和官网。
在使用 requests + BeautifulSoup 进行网页数据采集时,你可能会遇到邮箱字段显示为类似 /cdn-cgi/l/email-protection#f18394909d94828590859482b199949895989093949d94df929e9c 的加密字符串——这并非 HTML 中的真实邮箱,而是 Cloudflare 的邮箱混淆(Email Obfuscation)技术生成的保护层。该机制通过 JavaScript 动态解密并渲染邮箱,而 BeautifulSoup 仅解析静态 HTML,无法执行 JS,因此直接查找 或文本节点必然失败。
真正的解决方案是:绕过前端渲染逻辑,直取服务端注入的原始数据。现代 Next.js 应用(如 kw.com)会在页面中嵌入一个 <script id="__NEXT_DATA__"></script> 标签,其内容为序列化的 JSON 对象,完整包含页面所需的所有结构化数据(包括未混淆的原始邮箱)。
以下为稳定、高效的提取代码:
import requests
from bs4 import BeautifulSoup
import json
url = 'https://www.kw.com/agent/UPA-6587385179144187908-1'
response = requests.get(url)
response.raise_for_status() # 确保请求成功
soup = BeautifulSoup(response.text, 'lxml')
script_tag = soup.find('script', {'id': '__NEXT_DATA__'})
if not script_tag:
raise ValueError("Failed to locate __NEXT_DATA__ script tag")
json_data = json.loads(script_tag.string)
agent_data = json_data['props']['pageProps']['agentData']
# 直接获取原始字段(无需解密,无混淆)
name = agent_data['name']['full']
city = agent_data['location']['city']
state = agent_data['location']['state']
email = agent_data['email'] # ✅ 真实邮箱字符串,如 'heidi.abele@kw.com'
website = agent_data.get('website', '').strip()
print(f"Name: {name}")
print(f"Location: {city}, {state}")
print(f"Email: {email}")
print(f"Website: {website}")
✅ 输出示例:
Name: Heidi Abele Location: Campbell, CA Email: heidi.abele@kw.com Website: https://heidiabelerealtor.com/
关键注意事项:
- 始终检查
__NEXT_DATA__脚本是否存在,避免KeyError;建议用.get()或try/except处理缺失字段; -
agentData结构可能随前端版本更新而微调,建议先打印json_data['props']['pageProps']快速探查字段路径; - 此方法不依赖 CSS 类名(如
AgentContent__name),规避了因前端重构导致的 selector 失效问题,鲁棒性远高于纯 HTML 解析; - 若目标站点非 Next.js 架构,请优先检查
window.__INITIAL_STATE__、<script type="application/ld+json"></script>或 API 接口(可通过浏览器 Network 面板定位 XHR/Fetch 请求)。
综上,面对邮箱保护或动态渲染页面,放弃“爬取可见 HTML”的思维,转向解析服务端预置的 JSON 数据源,是高效、稳定、可维护的数据采集核心策略。











