使用Python Selenium采集Instagram点赞用户时弹窗无法滚动加载
问题根因
所有之前尝试的滚动操作都触发主页面滚动,本质是从未定位到点赞弹窗的专属滚动容器。Instagram的点赞列表是独立浮层结构,浮层内部自带固定高度的可滚动区域,和主文档的滚动条完全隔离,任何针对主页面、弹窗外部元素的滚动指令,都无法驱动浮层内列表的懒加载逻辑,自然加载不出全部用户。
修正实现方案
- 进入点赞弹窗后,第一步先通过固定类名定位弹窗内部的滚动容器:该容器的类选择器为
.isgrP,是承载所有点赞用户条目、带溢出滚动属性的div元素,是所有滚动操作的唯一正确目标。 - 去掉所有针对主页面、无关元素的
scrollIntoView、按键发送滚动的逻辑,直接对.isgrP容器执行内部滚动操作,把容器的滚动位置拉到当前内容的最底部。 - 采用循环判断的方式实现全量加载:每轮滚动后等待2秒让懒加载内容渲染,重新抓取当前所有已加载的用户名,当连续两次滚动后容器的总滚动高度没有变化时,就代表已经滑到列表最底部,所有点赞用户都加载完成了。
可直接替换的代码片段
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 等待点赞弹窗加载完成,获取内部滚动容器 scroll_container = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".isgrP")) ) collected_likers = set() last_scroll_height = 0 while True: # 每轮重新抓取当前已渲染的所有点赞用户名,用集合去重 liker_elements = browser.find_elements(By.CSS_SELECTOR, ".FPmhX.notranslate.MBL3Z") for elem in liker_elements: collected_likers.add(elem.get_attribute("title")) # 对弹窗内部容器执行滚动到底操作 browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container) # 等待网络请求和DOM渲染完成 time.sleep(2) # 校验是否到达列表末尾 current_scroll_height = browser.execute_script("return arguments[0].scrollHeight", scroll_container) if current_scroll_height == last_scroll_height: break last_scroll_height = current_scroll_height # 循环结束后collected_likers即为全量点赞用户名集合 print(f"全量采集完成,共获取{len(collected_likers)}个点赞用户")
避坑提示
- 原代码中定位包含“#”文本的元素并点击的逻辑和当前任务完全无关,会误触页面评论区的话题标签入口,打断弹窗操作,建议直接删除。
- 单轮滚动后的等待时间不要短于1.5秒,过快的滚动请求会触发Instagram的反爬限流,导致列表停止加载。
- 不要在弹窗刚打开时只抓取一次用户名,必须在每轮滚动后重新查询DOM元素,否则永远只能拿到初始加载的11个用户。
内容的提问来源于stack exchange,提问作者user9549796
相关产品推荐
相关产品推荐

