Python使用Selenium提取Instagram带k(千)格式粉丝数的实现问题
Instagram粉丝数提取可运行实现方案
原代码运行失效主要有两个核心原因:
- XPath语法残缺:写法中
contains(@title)未补全匹配参数、未闭合括号,会直接触发定位解析报错;且Selenium 4+版本已废弃find_element_by_xpath这类旧调用方式,直接调用会抛出属性错误。 - 类型转换逻辑不匹配:元素可见文本带
k类非数字后缀,int()方法无法直接解析包含非数字字符的字符串,必然触发转换异常。
方案1:从title属性提取精确完整数值(推荐)
对应通过属性取数的思路:目标span元素本身就将无缩写的完整粉丝数存储在title属性中,直接读取属性值即可拿到和前端存储完全一致的高精度数值,无需做换算。
实现代码:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显式等待元素加载完成,避免页面未渲染完成就定位元素 follower_span = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.XPATH, "//li//a/span[contains(@title, '')]")) ) # 读取title属性的原始值,移除千位分隔逗号后转换为整数 follower_count = int(follower_span.get_attribute("title").replace(",", ""))
该方案不存在缩写换算带来的精度损失,是最稳妥的取数方式
方案2:解析带缩写后缀的可见文本(兜底适用)
如果遇到title属性取值异常的场景,可以通过匹配文本后缀的量级做换算,覆盖k(千)、m(百万)这类Instagram常用的缩写格式:
# 定位元素获取可见文本 raw_text = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.XPATH, "//li//a/span[contains(@title, '')]")) ).text # 清除文本中的千位分隔符 clean_text = raw_text.replace(",", "") if clean_text.endswith("k"): # 带k后缀的文本,去掉后缀后乘1000换算为整数 follower_count = int(float(clean_text[:-1]) * 1000) elif clean_text.endswith("m"): # 带m后缀的文本,去掉后缀后乘1000000换算为整数 follower_count = int(float(clean_text[:-1]) * 1000000) else: # 无后缀的纯数字直接转换 follower_count = int(clean_text)
内容的提问来源于stack exchange,提问作者user14915996
相关产品推荐
相关产品推荐

