1. 项目背景与挑战
东南亚地区的展会网站数据采集一直是个技术活,特别是像柬埔寨国际塑料橡胶展(CIMIF Cambodia)这样的专业展会网站。这类网站通常采用多种反爬机制,给数据采集工作带来了不小的挑战。我在最近的一个项目中,就遇到了四个典型的技术难题:
- 邮箱信息被多种方式编码保护
- 国际电话号码格式复杂多样
- 主办方信息干扰有效数据
- 多页面深度爬取的控制问题
这些难题如果不解决,采集到的数据准确率会大打折扣。经过两周的攻关,我们最终实现了92%以上的数据准确率。下面我就详细分享下每个问题的解决方案和实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术难点全景解析
2.1 难点一:邮箱编码与解码机制
展会网站为了防止爬虫采集联系方式,对邮箱地址进行了各种形式的编码处理。我们发现了至少15种不同的编码方式:
- 符号替换:最常见的是用
[at]代替@,[dot]代替.,还有使用(at)、{at}等变体 - HTML实体编码:如
@表示@,.表示. - JavaScript动态拼接:邮箱被拆分成多个部分,通过JS拼接
- Base64编码:部分邮箱被编码后隐藏在脚本中
- 图片显示:少数重要联系人邮箱直接以图片形式呈现
针对这些情况,我们开发了一个多模式邮箱解码器。核心思路是:
- 先提取页面中所有可能包含邮箱的文本片段
- 应用正则表达式匹配各种编码模式
- 对匹配到的内容进行多层解码
- 最后验证解码结果是否符合邮箱格式
关键代码实现:
python复制def decode_email(encoded_str):
# 第一层:替换常见编码
replacements = {
'[at]': '@', '(at)': '@', '{at}': '@',
'[dot]': '.', '(dot)': '.', '{dot}': '.'
}
for old, new in replacements.items():
encoded_str = encoded_str.replace(old, new)
# 第二层:处理HTML实体
encoded_str = html.unescape(encoded_str)
# 第三层:尝试Base64解码
try:
decoded_bytes = base64.b64decode(encoded_str)
encoded_str = decoded_bytes.decode('utf-8')
except:
pass
# 验证最终结果是否为有效邮箱
if re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', encoded_str):
return encoded_str
return None
注意:在实际应用中,我们发现有些网站会混合使用多种编码方式,所以解码顺序很重要。通常应该先处理最外层的编码,再逐步向内解码。
