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)

主要变化点:

  1. CSS选择器从之前的.xxx变成了更复杂的类名组合
  2. SVG映射从简单的y轴偏移变成了x,y双坐标映射
  3. 数字计算需要根据实际SVG的布局动态调整除数

你需要根据实际页面调整y // 30这个计算规则,观察SVG中text元素的实际间距来设置正确的除数。

一句话建议:动态解析CSS和SVG的映射关系是关键。

回到顶部