使用Python+Selenium操作Instagram点击元素遇拦截及属性错误求解
问题解决方案
错误修复说明
1. AttributeError: 'WebDriver' object has no attribute 'findElement' 修复
该报错由Selenium API写法不规范导致:
- Python版Selenium统一使用下划线命名的元素查找方法,没有驼峰式
findElement接口 - 旧版Selenium的
find_elements_by_css_selector这类方法在Selenium 4中已被移除,需要统一替换为find_elements(By.CSS_SELECTOR, 选择器)格式 - 原代码中判断元素数量用的
.size()是Java Selenium的写法,Python中find_elements返回列表,直接用len()判断长度即可
2. ElementClickInterceptedException 元素被遮挡修复
该报错由未处理的弹窗或元素未完全加载导致:
- 登录后主动关闭Instagram弹出的「保存登录信息」「开启通知」弹窗,避免弹窗遮挡后续操作元素
- 对需要点击的元素增加显式等待,等待元素可交互后再执行操作,替换部分固定时长的
sleep - 特殊场景下可以用JavaScript执行点击,绕过前端元素遮挡校验
3. 点赞状态判断逻辑修复
原逻辑完全写反,调整规则如下:
- 能找到
aria-label="Unlike"元素,说明帖子已点赞,不需要执行操作 - 找不到
Unlike元素时,才需要查找Like按钮执行点击 - 补充变量定义的分支覆盖,避免出现未定义变量就调用的报错
4. 其他细节优化
- 原逻辑取前3条帖子的判断条件错误,会实际执行4次点击,调整为计数达到3就终止
- 修复关闭按钮的XPath路径,原路径无法匹配到正确的关闭按钮
修改后完整代码
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 from selenium.webdriver.support.relative_locator import locate_with from selenium.webdriver.firefox.service import Service import time sleeptime = 10 def login(browser): browser.maximize_window() browser.get("https://www.instagram.com") time.sleep(sleeptime) username = browser.find_element(By.NAME,"username") password = browser.find_element(By.NAME,"password") login_btn = browser.find_element(locate_with(By.TAG_NAME, "button").below(password)) # 注意:建议把账号密码改成从环境变量读取,避免明文泄露 username.send_keys("Hkk_james38") password.send_keys("myfmox-tidgab-xotNo0") login_btn.click() time.sleep(sleeptime) # 处理保存登录信息弹窗 try: save_login_btn = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[text()='Not Now' or text()='暂不']")) ) save_login_btn.click() except: pass time.sleep(3) # 处理通知权限弹窗 try: notify_btn = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[text()='Not Now' or text()='暂不']")) ) notify_btn.click() except: pass time.sleep(sleeptime) def Visit_Tag(driver, url): sleeptime = 6 driver.get(url) time.sleep(sleeptime) # 替换为Selenium 4支持的写法 pictures = driver.find_elements(By.CSS_SELECTOR, "div[class = '_9AhH0']") print(f"找到帖子数量:{len(pictures)}") image_count = 0 for picture in pictures: # 取前3条就终止 if image_count >= 3: break # 用JS点击帖子,避免遮挡 driver.execute_script("arguments[0].click();", picture) time.sleep(sleeptime) # 点赞逻辑修复 unlike_list = driver.find_elements(By.XPATH,"//article//section//button//*[@aria-label='Unlike']") # 没有Unlike元素说明未点赞,需要执行点赞 if len(unlike_list) == 0: try: like = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH,"//article//section//button//*[@aria-label='Like']")) ) # 用JS点击避免遮挡 driver.execute_script("arguments[0].click();", like) print(f"第{image_count+1}条帖子点赞成功") except Exception as e: print(f"点赞失败:{e}") else: print(f"第{image_count+1}条帖子已点赞,跳过") # 关闭按钮XPath修复 try: close = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH,"//*[@aria-label='Close']")) ) driver.execute_script("arguments[0].click();", close) except Exception as e: print(f"关闭帖子失败:{e}") time.sleep(2) image_count += 1 def main(): service = Service('/usr/local/bin/geckodriver') browser = webdriver.Firefox(service = service) login(browser) tags = {"programming"} for tag in tags: Visit_Tag(browser, f"https://www.instagram.com/explore/tags/{tag}") # 操作完成后关闭浏览器 browser.quit() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Harry Hau
相关产品推荐
相关产品推荐

