基于Selenium的LinkedIn每日自动化Bot开发问题求助
问题描述
我正在编写一个每日自动运行的Bot,目标是登录LinkedIn后进入特定联系人的聊天窗口,当对方发送帖子类消息时,Bot回复我的邮箱并提示对方发送简历。现有Python代码如下:
def start(): driver.get("https://www.linkedin.com") time.sleep(3) username = driver.find_element(By.ID, 'session_key') username.send_keys(MyUsername) time.sleep(0.7) password = driver.find_element(By.ID, "session_password") password.send_keys(MyPassword) time.sleep(0.3) button_sign = driver.find_element(By.XPATH, '//*[@type="submit"]') button_sign.click() time.sleep(3) # scroll_down_random() button_messaging = driver.find_element(By.XPATH, '//*[@id="global-nav"]/div/nav/ul/li[4]/a') button_messaging.click() time.sleep(2) search_chat = driver.find_element(By.XPATH, '//*[@id="search-conversations"]') search_chat.send_keys(name_of_chat) search_chat.send_keys(Keys.ENTER) time.sleep(2) submit_application = driver.find_element(By.ID,'//*[@id="ember65"]') submit_application.click()
目前遇到两个问题:
- 搜索聊天后无法选中首个聊天对象
- 部署到云端时,如何保持登录状态,无需每次重新登录
解决方案
一、解决搜索聊天后无法选中首个聊天对象的问题
你代码最后一步犯了个低级错误:用By.ID定位元素,但传入的是XPATH路径,这肯定找不到元素。而且LinkedIn的ember开头的ID是动态生成的,每次刷新页面都会变,硬编码完全不可靠。
正确的做法是:
- 用
WebDriverWait替代固定的time.sleep,等待搜索结果加载完成 - 用稳定的CSS选择器或XPATH定位第一个聊天结果,比如根据聊天项的通用类名
修改后的代码片段:
# 先导入需要的模块 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 替换原来的submit_application相关代码 # 等待第一个聊天结果可点击,超时时间10秒 first_chat = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.conversation-item__content')) ) first_chat.click()
如果上述CSS选择器不生效,你可以打开LinkedIn的开发者工具,查看搜索结果里聊天项的DOM结构,换一个更精准的选择器,比如包含联系人名称的元素路径。
二、云端部署保持登录状态的方法
LinkedIn的登录状态靠Cookie维持,你可以在本地登录一次后把Cookie保存下来,之后每次启动Bot时直接加载Cookie,就能跳过登录步骤。
步骤1:本地登录并保存Cookie
在本地运行代码,登录成功后执行以下代码把Cookie保存到文件:
import pickle # 确保已经登录成功,比如进入消息页面后 pickle.dump(driver.get_cookies(), open("linkedin_cookies.pkl", "wb"))
步骤2:云端加载Cookie跳过登录
修改启动代码,先加载Cookie再访问LinkedIn:
def start(): driver.get("https://www.linkedin.com") # 加载保存的Cookie文件 cookies = pickle.load(open("linkedin_cookies.pkl", "rb")) for cookie in cookies: driver.add_cookie(cookie) # 刷新页面,此时应该已经处于登录状态 driver.refresh() # 直接进入消息页面,跳过登录流程 button_messaging = driver.find_element(By.XPATH, '//*[@id="global-nav"]/div/nav/ul/li[4]/a') button_messaging.click() # 后续的搜索聊天逻辑...
注意事项
- 要把
linkedin_cookies.pkl和代码一起上传到云端 - Cookie有有效期,过几个星期可能会失效,需要重新在本地登录更新Cookie
- 云端要使用和本地相同的浏览器驱动(比如本地用Chrome,云端也要用ChromeDriver),否则Cookie可能不兼容
内容的提问来源于stack exchange,提问作者oren a
相关产品推荐
相关产品推荐

