使用Selenium获取Instagram数据:get_basic_info方法故障求助
问题解决步骤
1. 修复代码语法错误
get_basic_info方法里第一行元素定位代码遗漏了self,属于低级语法错误:
# 错误写法 follower_count_element = .browser.find_element(...) # 正确写法 follower_count_element = self.browser.find_element(...)
2. 绕过Instagram自动化检测
Instagram会识别默认ChromeDriver的自动化特征,导致页面显示"A problem has occurred"。需配置ChromeOptions隐藏这些特征:
from selenium.webdriver.chrome.options import Options def __init__(self, username, password): chrome_options = Options() # 隐藏自动化提示 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 模拟正常用户代理 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.71 Safari/537.36") # 禁用Blink自动化特性 chrome_options.add_argument("--disable-blink-features=AutomationControlled") self.browser = webdriver.Chrome(options=chrome_options)
3. 改用稳定的元素定位方式
Instagram的class是动态生成的,会定期变化,不能依赖固定class定位。可通过元素文本、链接特征来定位:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_basic_info(self): self.sign_in() self.browser.get(f'https://www.instagram.com/{self.username}/') wait = WebDriverWait(self.browser, 15) # 定位帖子数(适配土耳其语界面) post_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//span[contains(text(), "Gönderiler")]/preceding-sibling::span') )).text # 定位粉丝数(取title属性获取完整数字,避免页面显示缩写) follower_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//a[contains(@href, "/followers/")]/span') )).get_attribute('title') # 定位关注数 following_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//a[contains(@href, "/following/")]/span') )).text
4. 调整登录流程
原sign_in方法末尾调用了self.browser.close(),导致后续get_basic_info执行时浏览器已关闭,需移除该代码,并优化登录等待逻辑:
def sign_in(self): self.browser.get("https://www.instagram.com/accounts/login/") wait = WebDriverWait(self.browser, 15) # 显式等待输入框加载完成 user_name_entry = wait.until(EC.presence_of_element_located((By.NAME, "username"))) user_password_entry = wait.until(EC.presence_of_element_located((By.NAME, "password"))) user_name_entry.send_keys(self.username) user_password_entry.send_keys(self.password, Keys.ENTER) # 跳过"保存登录信息"提示 try: wait.until(EC.element_to_be_clickable((By.XPATH, '//div[text()="Şimdi Değil"]'))).click() except: pass
完整修正代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Instagram_Data(): def __init__(self, username, password): chrome_options = Options() chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.71 Safari/537.36") chrome_options.add_argument("--disable-blink-features=AutomationControlled") self.browser = webdriver.Chrome(options=chrome_options) self.main_url = "https://www.instagram.com/" self.password = password self.username = username def sign_in(self): self.browser.get("https://www.instagram.com/accounts/login/") wait = WebDriverWait(self.browser, 15) user_name_entry = wait.until(EC.presence_of_element_located((By.NAME, "username"))) user_password_entry = wait.until(EC.presence_of_element_located((By.NAME, "password"))) user_name_entry.send_keys(self.username) user_password_entry.send_keys(self.password, Keys.ENTER) try: wait.until(EC.element_to_be_clickable((By.XPATH, '//div[text()="Şimdi Değil"]'))).click() except: pass def get_basic_info(self): self.sign_in() self.browser.get(f'https://www.instagram.com/{self.username}/') wait = WebDriverWait(self.browser, 15) post_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//span[contains(text(), "Gönderiler")]/preceding-sibling::span') )).text follower_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//a[contains(@href, "/followers/")]/span') )).get_attribute('title') following_count = wait.until(EC.presence_of_element_located( (By.XPATH, '//a[contains(@href, "/following/")]/span') )).text print(f'Takipçi Sayısı: {follower_count}') print(f'Takip Sayısı: {following_count}') print(f'Gönderi Sayısı: {post_count}') self.browser.close() object = Instagram_Data("你的用户名", "你的密码") object.get_basic_info()
关键说明
- 用显式等待替代
sleep,避免因网络延迟导致的元素加载失败问题 - 隐藏自动化特征是绕过Instagram反爬检测的核心
- 基于文本、链接特征的定位方式,不受Instagram前端class更新影响
内容的提问来源于stack exchange,提问作者mahdi
相关产品推荐
相关产品推荐

