抓取含@符号的游戏名称时被识别为邮箱的解决方法
批量解决Cloudflare混淆的游戏名称(含@符号)问题
这是Cloudflare的邮箱混淆机制误将游戏名里的@识别成邮箱导致的,直接爬取会得到[email protected]占位符。可以通过解析__cf_email__标签的data-cfemail属性批量解密还原真实名称。
步骤1:实现Cloudflare混淆内容的通用解密函数
Cloudflare的解密逻辑是:将data-cfemail的十六进制字符串转成字节数组,以第一个字节为密钥,依次异或后续每个字节,得到原字符的ASCII码,再拼接成字符串。
def decode_cf_email(cf_email): # 将十六进制字符串转为字节数组 bytes_data = bytes.fromhex(cf_email) # 第一个字节是密钥 key = bytes_data[0] # 遍历后续字节,异或密钥得到原字符 decoded = ''.join([chr(b ^ key) for b in bytes_data[1:]]) return decoded
步骤2:批量处理页面中的所有混淆元素
在获取页面并解析为BeautifulSoup对象后,遍历所有带__cf_email__类的span标签,解密后替换原标签内容:
import requests from bs4 import BeautifulSoup def process_game_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 批量处理所有__cf_email__标签 cf_email_spans = soup.find_all('span', class_='__cf_email__') for span in cf_email_spans: cf_email_data = span.get('data-cfemail') if cf_email_data: decoded_text = decode_cf_email(cf_email_data) # 替换span标签为解密后的文本 span.replace_with(decoded_text) # 按需提取游戏名称,此处假设游戏名在h1标签内,可根据实际页面结构调整 game_name = soup.find('h1').get_text(strip=True) return game_name # 批量抓取示例:遍历游戏URL列表 game_urls = [ 'https://example.com/game1', 'https://example.com/game2', # 更多游戏URL... ] for url in game_urls: try: name = process_game_page(url) print(f"游戏名称:{name}") except Exception as e: print(f"处理{url}失败:{str(e)}")
关键说明
- 必须带上合理的
User-Agent,避免被Cloudflare拦截 - 解密函数是通用的,能处理所有Cloudflare混淆的
__cf_email__标签,不管是邮箱还是被误判的游戏名 - 批量处理时,只需在解析页面后调用一次遍历替换逻辑,就能自动修复所有混淆内容
内容的提问来源于stack exchange,提问作者Xiaowei Zhang
相关产品推荐
相关产品推荐

