如何用Selenium统计Instagram Bot观看的故事数量及检测故事结束
检测Instagram故事结束状态并统计观看数量的解决方案
要实现自动检测故事结束、判断是否存在下一个故事并统计观看数量,我们可以通过监控Instagram故事的进度条和UI元素来替代硬编码的sleep()。以下是具体实现步骤和代码:
核心思路
- 监控进度条:Instagram故事顶部的进度条对应每一个故事,当前播放的进度条会逐渐填满至100%宽度,以此判断故事是否结束。
- 显式等待:使用Selenium的显式等待替代固定休眠,确保操作仅在元素就绪时执行,提升稳定性。
- 判断后续故事:每完成一个故事后,检查是否存在未播放的进度条,或是否出现关闭按钮(无后续故事时会显示)。
- 统计数量:每完成一个故事就递增计数,直到无后续故事时退出并返回总数。
修改后的完整代码
首先确保导入所需模块:
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By
然后更新你的函数:
def OpenStories(driver): storyButton = WebDriverWait(driver,5).until(EC.presence_of_element_located((By.CLASS_NAME, '_aarh'))) ActionChains(driver).move_to_element(storyButton).click(storyButton).click(storyButton).perform() def WatchStories(driver): OpenStories(driver) story_count = 0 while True: try: # 等待当前故事进度条填满至100% active_progress = WebDriverWait(driver, 20).until( lambda d: d.find_element(By.CSS_SELECTOR, 'div._aa6a').get_attribute('style').split('width: ')[1].strip() == '100%' ) story_count += 1 # 检查是否存在下一个故事:判断未激活的进度条数量,或是否出现关闭按钮 remaining_stories = len(driver.find_elements(By.CSS_SELECTOR, 'div._aa6b:not(.aa6a)')) close_button = driver.find_elements(By.CLASS_NAME, '_abl-') if remaining_stories == 0 or len(close_button) > 0: # 无后续故事,关闭播放器并退出循环 close_button[0].click() break else: # 点击屏幕右侧切换到下一个故事 screen_width = driver.execute_script('return window.innerWidth') screen_height = driver.execute_script('return window.innerHeight') ActionChains(driver).move_to_element_with_offset( driver.find_element(By.TAG_NAME, 'body'), screen_width // 2 + 10, screen_height // 2 ).click().perform() # 等待下一个故事的进度条加载 WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div._aa6a'))) except TimeoutException: # 故事加载超时,退出循环 break print(f"已观看故事总数:{story_count}") return story_count
注意事项
- Instagram的类名(如
_aa6a、_abl-)是动态生成的,可能会随平台更新而变化。如果代码失效,建议使用浏览器开发者工具重新定位元素的选择器。 - 显式等待的超时时间可根据网络情况调整,避免因加载缓慢导致误判。
内容的提问来源于stack exchange,提问作者Suta Purachina
相关产品推荐
相关产品推荐

