使用Selenium爬取Twitter粉丝遇元素定位问题求助
解决Selenium批量获取Twitter粉丝用户名的问题
首先明确:Twitter(X)的粉丝列表是动态加载的,只爬取初始页面只能拿到少量用户,必须配合滚动加载才能批量获取。另外,直接用类名定位容易失效(Twitter经常改前端类名),建议用更稳定的属性定位。
核心步骤
- 用
WebDriverWait等待页面元素加载,避免因页面未渲染完成导致的定位失败 - 循环滚动页面,触发动态加载更多粉丝
- 精准定位用户名元素,批量提取并去重
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器(这里用Chrome,其他浏览器同理) driver = webdriver.Chrome() driver.get("https://twitter.com/目标用户名/followers") driver.maximize_window() # 假设你已经完成登录,这里直接处理粉丝页 wait = WebDriverWait(driver, 10) # 存储已获取的用户名,避免重复 usernames = set() # 循环滚动加载,这里设置滚动次数,可根据需求调整 scroll_count = 10 for _ in range(scroll_count): # 等待粉丝列表元素加载 follower_items = wait.until(EC.presence_of_all_elements_located( (By.XPATH, '//div[@data-testid="cellInnerDiv"]//span[contains(text(), "@")]') )) # 提取用户名 for item in follower_items: username = item.text.strip() if username.startswith("@"): usernames.add(username) # 滚动到页面底部,触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 等待加载,时间可根据网络调整 # 输出结果 print("获取的粉丝用户名:") for name in usernames: print(name) driver.quit()
关键说明
- 定位方式选择:用
data-testid属性定位粉丝条目(//div[@data-testid="cellInnerDiv"]),再嵌套找里面带@的span,比直接找@更精准,避免抓取到非用户名的@内容。 - 滚动加载处理:每次滚动后等待2秒让页面加载,滚动次数可根据需要爬取的粉丝数量调整。
- 去重处理:用集合
set存储用户名,自动去重重复加载的内容。 - 异常排查:如果运行中出现元素超时,可适当延长
WebDriverWait的等待时间,或调整滚动后的等待时长;若出现人机验证,需手动处理或添加对应验证逻辑。
内容的提问来源于stack exchange,提问作者DeathCraft
相关产品推荐
相关产品推荐

