Python Web Scraping:类名重复无ID及双向认证下的爬取问题
Web Scraping两类问题解决方案
问题1:双向认证页面Selenium访问被拦截,手动访问正常
问题原因
手动访问时使用的是日常浏览器实例,已经加载了本地存储的客户端证书、有效会话凭证,Selenium默认启动的是全新的无状态浏览器实例,没有携带对应认证凭证,因此会被双向认证规则拦截。
可行方案
- 复用本地日常浏览器的用户配置文件:启动Selenium时指定本地浏览器的用户数据目录,直接加载已经完成认证的浏览器环境,注意启动前需要关闭所有正在运行的对应浏览器进程,避免配置文件被锁定。Chrome浏览器示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_opts = Options() # 替换为本地Chrome用户数据实际路径,Windows默认路径为C:/Users/[你的用户名]/AppData/Local/Google/Chrome/User Data chrome_opts.add_argument("--user-data-dir=你的本地浏览器用户数据路径") driver = webdriver.Chrome(options=chrome_opts)
- 单独加载客户端证书:如果不想复用完整浏览器配置,可以在启动参数中单独指定双向认证需要的客户端证书(pfx格式),Chrome可通过
--client-certificate参数指定证书路径,Firefox可通过浏览器配置项指定绑定的客户端证书。 - 注入有效会话Cookie:首次手动打开目标页面后,导出目标域名下的所有有效Cookie,Selenium启动后先访问目标域名的根路径,再通过
add_cookie方法批量注入所有Cookie,刷新页面即可通过认证。
问题2:同class无唯一属性的表格定位
核心思路
不要依赖class、id这类元素属性,从内容特征、结构特征、相对位置三个维度做定位,完全可以区分高度相似的表格元素。
可行方案
- 基于独有内容特征匹配:先确认目标表格中存在的、其他非目标表格绝对不会出现的固定文本(比如专属表头字段、固定标题文字),先抓取页面内所有同class的表格元素,遍历判断表格内是否包含该独有文本,匹配到的即为目标表格。示例代码:
from selenium.webdriver.common.by import By # 先获取所有同class的表格 all_tables = driver.find_elements(By.CSS_SELECTOR, "table.公共class名") target_table = None # 替换为目标表格独有的标记文本,比如专属表头"交易记录" unique_text_mark = "目标表格独有固定文本" for table in all_tables: if unique_text_mark in table.text: target_table = table break
- 基于锚点元素做相对定位:找到目标表格附近位置固定、可唯一识别的锚点元素(比如表格上方的专属标题、说明文字块),通过XPath轴定位获取锚点相邻的目标表格。比如目标表格上方有固定标题「数据明细」,可直接用XPath定位:
target_table = driver.find_element(By.XPATH, '//*[contains(text(),"数据明细")]/following::table[1]')
- 基于结构差异区分:对比目标表格和非目标表格的结构差异,比如列数、行数、嵌套层级:
- 若目标表格列数固定(比如8列),非目标表格列数不同,遍历表格时统计首行的td/th数量即可匹配
- 若目标表格和非目标表格的父级容器层级不同,可通过DOM层级路径做定位,比如定位主内容区下的表格,排除侧边栏、弹窗内的非目标表格
内容的提问来源于stack exchange,提问作者Takin Karampour
相关产品推荐
相关产品推荐

