在Selenium中遍历Web元素获取Facebook指定关键词页面链接失败求助
Facebook搜索页面获取页面链接问题解决
问题说明
我想在Facebook搜索页面(关键词为orange,测试链接:https://www.facebook.com/search/pages/?q=orange)中抓取对应页面的链接,折腾了好几个小时都没成功。使用的代码如下,执行后没有任何输出:
first_result = self.driver.find_element( By.XPATH, "(//div[@role='feed'])[1]") # 获取div容器 ok1 = first_result.find_elements( By.CSS_SELECTOR, "div[role='article']") # 用CSS选择器获取每个div,因为用类名只能拿到第一个元素 ok = ok1.find_elements( By.CLASS_NAME, "aeinzg81 i15ihif8 cgu29s5g jg3vgc78 gb2oqlaf") # 包含文本的类 for _ in ok: print(_.text) # 本来想拿href,先打印文本看结果,结果啥都没有
问题原因
- 类名动态生成:Facebook的元素类名是随机动态生成的,每次刷新页面都会变化,固定写死类名肯定找不到元素。
- 元素加载未等待:页面还没完全加载就执行查找操作,此时目标元素还没渲染出来。
- 方法调用错误:
ok1是find_elements返回的元素列表,不能直接调用find_elements,得遍历每个元素去查找子元素。 - 定位逻辑偏差:原代码定位的类并非实际包含页面链接的元素,定位路径不对。
修正后的代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显式等待feed容器加载完成,最长等10秒 feed_container = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[@role='feed']")) ) # 获取所有搜索结果的article元素 articles = feed_container.find_elements(By.CSS_SELECTOR, "div[role='article']") for article in articles: try: # 用链接的href特征定位,比类名稳定 page_link = article.find_element(By.XPATH, ".//a[contains(@href, '/pages/') or contains(@href, '/profile.php')]") # 提取页面名称和链接 page_name = page_link.text.strip() page_href = page_link.get_attribute("href") if page_name and page_href: print(f"{page_name}: {page_href}") except Exception: # 跳过无法定位的元素,避免循环中断 continue
额外注意点
- 必须确保Driver处于登录Facebook的状态,未登录的搜索页面结果受限。
- 如果要抓取更多结果,需要模拟滚动页面到底部,等待新元素加载后再继续遍历。
- Facebook反爬严格,不要频繁快速请求,适当加入
time.sleep()间隔,避免账号被限制。
内容的提问来源于stack exchange,提问作者Charbel Eid
相关产品推荐
相关产品推荐

