使用Selenium抓取Facebook页面名称及点赞数遇错误求助
问题原因及解决方法
1. 无法获取title标签内容的原因
<title>标签位于HTML的<head>节点下,不属于页面可见渲染元素,Selenium的.text方法只能获取到在页面视口中渲染显示的文本,所以会返回空值。
正确获取方式
两种方案可选:
- 直接调用Selenium内置属性获取:
driver.title可以直接返回当前页面标题内容 - 如果需要通过标签定位获取,使用
get_attribute方法读取标签内容:
politician_name = driver.find_element(By.TAG_NAME, 'title').get_attribute('textContent')
2. 原解决方案抛出TimeoutException的原因
- 定位条件使用错误:
element_to_be_clickable适用于按钮等可交互元素,页面标题、点赞数展示元素属于静态展示元素,不满足可点击判定条件 - Facebook前端结构频繁迭代,且未登录状态访问公共主页和登录后访问的DOM结构差异极大,你使用的固定ID、固定层级XPATH已经和当前页面结构不匹配
3. 更稳定的点赞数获取方案(从script标签提取,不受UI结构变化影响)
直接匹配页面内嵌script中的global_likers_count字段,比爬取UI元素稳定性高很多,完整可运行代码如下:
import re from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # 初始化driver,此处以Chrome为例,可替换为自己使用的浏览器驱动 driver = webdriver.Chrome() link = 'http://www.facebook.com/123439757700947' driver.get(link) # 等待页面加载完成,等待title标签出现 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.TAG_NAME, 'title'))) # 获取政治家姓名 politician_name = driver.title print(f"政治家姓名:{politician_name}") # 获取页面所有HTML内容,用正则匹配点赞数字段 page_source = driver.page_source likers_match = re.search(r'"page_likers":{"global_likers_count":(\d+)}', page_source) if likers_match: global_likers_count = int(likers_match.group(1)) print(f"页面总点赞数:{global_likers_count}") else: print("未匹配到点赞数字段,建议检查页面是否正常加载、是否需要登录") driver.quit()
注意事项
- Facebook对未登录的爬虫访问限制很严格,如果频繁访问出现验证、跳转登录页的情况,建议先在Selenium中登录账号后再访问目标页面
- 正则匹配规则可以根据实际页面返回的结构微调,若拿到的page_source里字段格式有变化,调整正则表达式的匹配规则即可
内容的提问来源于stack exchange,提问作者Amir Katorza
相关产品推荐
相关产品推荐

