You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Selenium爬取Facebook群组帖子:无法按帖拆分数据

问题解决:Facebook群组帖子数据对应错误

核心原因

你在遍历单条帖子时,使用了//a[contains(@class,...)]的XPath写法,这种语法是从整个页面的根节点开始全局搜索,所以每次都会返回页面上所有符合条件的链接,而非当前帖子下的专属元素。

修复方法

把XPath开头的//改成.//,表示从当前遍历的post元素节点下进行相对搜索,就能精准获取当前帖子内的发帖人姓名:

name_spans = post.find_elements(By.XPATH,".//a[contains(@class,'x1i10hfl xjbqb8w x6umtig x1b1mbwd xaqea5y xav7gou x9f619 x1ypdohk xt0psk2 xe8uvvx xdj266r x11i5rnm xat24cr x1mh8g0r xexx8yu x4uap5 x18d9i69 xkhd6sd x16tdsg8 x1hl2dhg xggy1nq x1a2a7pz xt0b8zv xzsf02u x1s688f')]")

完整优化代码

结合你的需求,补充日期和帖子内容的提取逻辑,同时优化等待策略(减少硬编码sleep,改用显式等待更稳定):

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 random
import time

# Loading Cookies
browser = load_cookies.adding_cookies_browser(cookies)

# Get page
print("getting to fb")
browser.get("https://www.facebook.com/groups/1494117617557521?sorting_setting=CHRONOLOGICAL")
# 等待第一个帖子加载完成
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class,'x1yztbdb x1n2onr6 xh8yej3 x1ja2u2z')]")))

#Scroll until this member's post (so it only gets new posts)
last_member = ["member name here", "link here"]
new_members = [ ]

#scroll down until finding the last contact scrapped
scroll_count = 0
max_scroll = 20  # 防止无限循环的最大滚动次数
while scroll_count < max_scroll:
    #scroll down
    browser.execute_script("window.scrollBy(0, document.body.scrollHeight);")
    print("scrolling down")
    scroll_count += 1
    try:
        #looking for the last name that it has scrapped on the previous time. If finds it, stop scrolling down
        text = WebDriverWait(browser, random.randint(3,5)).until(EC.presence_of_element_located((By.XPATH, f"//*[text()='{last_member[0]}']")))
        print(f"found {last_member[0]}")
        break
    except:
        time.sleep(random.randint(2,3))

if scroll_count >= max_scroll:
    print("Reached max scroll attempts, stopping")

group_posts = []
posts = browser.find_elements(By.XPATH, "//div[contains(@class,'x1yztbdb x1n2onr6 xh8yej3 x1ja2u2z')]")
print(f"Found {len(posts)} posts")

# Getting each post info:
for index, post in enumerate(posts):
    print(f"Processing post {index}")
    post_data = {}
    
    # 提取发帖人姓名(相对路径搜索)
    try:
        name_elem = post.find_element(By.XPATH,".//a[contains(@class,'x1i10hfl xjbqb8w x6umtig x1b1mbwd xaqea5y xav7gou x9f619 x1ypdohk xt0psk2 xe8uvvx xdj266r x11i5rnm xat24cr x1mh8g0r xexx8yu x4uap5 x18d9i69 xkhd6sd x16tdsg8 x1hl2dhg xggy1nq x1a2a7pz xt0b8zv xzsf02u x1s688f')]")
        post_data['author'] = name_elem.text.strip()
    except:
        post_data['author'] = "Unknown"
    
    # 提取发帖日期
    try:
        date_elem = post.find_element(By.XPATH,".//span[contains(@class,'x193iq5w xeuugli x13faqbe x1vvkbs x1xmvt09 x1lliihq x1s928wv xhkezso x1gmr53x x1cpjm7i x1fgarty x1943h6x x4zkp8e x3x7a5m x6prxxf xvq8zen xo1l8bm xi81zsa')]")
        post_data['date'] = date_elem.text.strip()
    except:
        post_data['date'] = "Unknown"
    
    # 提取帖子内容
    try:
        content_elem = post.find_element(By.XPATH,".//div[contains(@class,'x1iorvi4 x1pi30zi x1swvt13')]")
        post_data['content'] = content_elem.text.strip()
    except:
        post_data['content'] = "No content"
    
    group_posts.append(post_data)
    print(post_data)

# 输出最终结果
print("\nAll posts data:")
for p in group_posts:
    print(f"Author: {p['author']}, Date: {p['date']}\nContent: {p['content']}\n---")

额外注意事项

  • Facebook的CSS类名是动态生成的,可能随时变化,如果后续定位失效,需要重新通过浏览器开发者工具获取最新类名,或改用更稳定的元素结构定位(比如依赖元素层级关系而非类名)。
  • 爬取Facebook内容需遵守平台规则,避免频繁请求导致账号封禁,建议增加合理的操作间隔,模拟人类浏览行为。

内容的提问来源于stack exchange,提问作者Fernando Nahat Jardim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:40:43