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

如何使用Selenium实现Facebook自动登录及修复现有代码问题?

Facebook企业页面自动登录与信息爬取代码修复

你的代码目前无法完成自动登录,核心问题在于元素定位方法错误,且每次爬取都重复启动浏览器登录,既低效又容易触发风控。以下是修复后的完整代码:

from bs4 import BeautifulSoup
import time
import openpyxl
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

def read_excel_file(file_name):
    wb = openpyxl.load_workbook(file_name)
    sheet = wb.active
    # 过滤空单元格,避免无效搜索
    leads = [cell.value for row in sheet.iter_rows() for cell in row if cell.value is not None]
    return leads

def login_to_facebook(driver, email, password):
    driver.get("https://www.facebook.com/")
    try:
        # 显式等待邮箱输入框加载完成
        email_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "email"))
        )
        password_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "pass"))
        )
        email_input.send_keys(email)
        password_input.send_keys(password)
        
        # 等待登录按钮并点击
        login_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.NAME, "login"))
        )
        login_button.click()
        
        # 等待登录跳转完成
        WebDriverWait(driver, 15).until(
            EC.url_contains("facebook.com")
        )
        print("登录成功")
    except Exception as e:
        print(f"登录失败: {e}")
        raise

def scrape_contact_info(driver, target_url):
    try:
        driver.get(target_url)
        # 等待页面关键元素加载
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-pagelet="ProfileContactSection"]'))
        )
        resp = driver.page_source

        soup = BeautifulSoup(resp, 'html.parser')
        contact_info = {"address": None, "number": None, "email": None}

        contact_items = soup.select('div[data-pagelet="ProfileContactSection"] span[dir="ltr"]')

        for contact in contact_items:
            text = contact.text.strip()
            if '@' in text:
                contact_info["email"] = text
            elif len(text.split("-")) > 2:
                contact_info["number"] = text
            elif len(text.split(",")) > 2:
                contact_info["address"] = text

        return contact_info

    except Exception as e:
        print(f"爬取信息失败: {e}")
        return None

def save_to_excel(file_name, data):
    wb = openpyxl.Workbook()
    sheet = wb.active
    sheet.append(["Keyword", "Address", "Number", "Email"])

    for item in data:
        sheet.append([item["keyword"], item["address"], item["number"], item["email"]])

    wb.save(file_name)

def main():
    try:
        file_name = "leadList.xlsx"
        email = "your_facebook_email_or_username"
        password = "your_facebook_password"
        keywords = read_excel_file(file_name)
        all_results = []

        # 初始化浏览器实例,仅登录一次
        driver = webdriver.Chrome()
        driver.maximize_window()
        login_to_facebook(driver, email, password)

        for keyword in keywords:
            target_url = f"https://www.facebook.com/{keyword}"
            print(f"正在爬取: {keyword}")
            contact_info = scrape_contact_info(driver, target_url)
            if contact_info:
                contact_info["keyword"] = keyword
                print(f"获取到信息: {contact_info}")
                print("-" * 50)
                all_results.append(contact_info)
            # 爬取间隔,避免触发风控
            time.sleep(2)

        if all_results:
            save_to_excel("search_results.xlsx", all_results)
            print("结果已保存到 search_results.xlsx")
        else:
            print("未获取到有效信息")

        driver.quit()
    except Exception as e:
        print(f"程序出错: {e}")
        try:
            driver.quit()
        except:
            pass

if __name__ == "__main__":
    main()

关键调整说明

  • 修正元素定位逻辑:原代码直接使用driver.find_element("email")是错误写法,改用By.ID/By.NAME结合显式等待,确保元素加载完成后再操作
  • 复用浏览器会话:将浏览器初始化移到main函数,仅登录一次,后续所有爬取都复用该会话,减少重复登录的耗时与风控风险
  • 替换硬编码sleep:使用WebDriverWait实现智能等待,比固定时间sleep更可靠,避免因网络波动导致的元素查找失败
  • 优化数据处理:读取Excel时过滤空单元格,避免无效搜索;爬取文本时先做strip处理,去除多余空格
  • 增加风控防护:添加爬取间隔,避免短时间内频繁请求触发Facebook的反爬机制

内容的提问来源于stack exchange,提问作者Ian Terry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:56:01