使用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
相关产品推荐
相关产品推荐

