Python中某点评网站的SVG反爬规则更新了,如何应对?
之前根据各像素一通小学数学加加减减 做了个小 demo, 最近运行发现报错,更新后的
Python中某点评网站的SVG反爬规则更新了,如何应对?
1 回复
我最近也遇到了这个反爬更新,他们的SVG映射规则确实变了。核心思路还是解析CSS和SVG来还原真实数字,但现在的class名和映射关系都做了调整。
这是目前可用的解析方案:
import re
import requests
from bs4 import BeautifulSoup
from io import StringIO
def parse_svg_mapping(html_content):
soup = BeautifulSoup(html_content, 'html.parser')
# 1. 提取CSS样式中的新映射规则
css_text = ''
for style in soup.find_all('style'):
css_text += style.get_text()
# 新规则:background-image: url('//s3plus...svg#xxx')
svg_pattern = r"background-image:\s*url\('(//s3plus[^']+\.svg)#([^']+)'\)"
svg_matches = re.findall(svg_pattern, css_text)
# 2. 获取SVG文件并解析坐标
svg_data = {}
for svg_url, svg_id in svg_matches:
full_svg_url = f'https:{svg_url}'
svg_response = requests.get(full_svg_url)
# 解析SVG中的text元素
svg_soup = BeautifulSoup(svg_response.text, 'xml')
text_elements = svg_soup.find_all('text', {'id': svg_id})
for text_elem in text_elements:
x = int(float(text_elem.get('x', 0)))
y = int(float(text_elem.get('y', 0)))
# 新规则:y坐标决定数字,x坐标决定位置索引
number = y // 30 # 根据实际调整这个除数
svg_data[svg_id] = {'number': number, 'x': x}
# 3. 替换HTML中的span标签
for span in soup.find_all('span', class_=re.compile(r'^[a-zA-Z]')):
class_name = span.get('class')[0]
if class_name in svg_data:
real_num = svg_data[class_name]['number']
span.string = str(real_num)
return str(soup)
# 使用示例
html = requests.get('目标页面URL').text
parsed_html = parse_svg_mapping(html)
主要变化点:
- CSS选择器从之前的
.xxx变成了更复杂的类名组合 - SVG映射从简单的y轴偏移变成了x,y双坐标映射
- 数字计算需要根据实际SVG的布局动态调整除数
你需要根据实际页面调整y // 30这个计算规则,观察SVG中text元素的实际间距来设置正确的除数。
一句话建议:动态解析CSS和SVG的映射关系是关键。

