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

