Python Selenium编写Instagram订阅者解析器:滚动模态窗口加载全部订阅者及XPATH定位失败求助
Python Selenium编写Instagram订阅者解析器:滚动模态窗口加载全部订阅者及XPATH定位失败求助
兄弟,我太懂你这种抓不到元素、滚动加载卡壳的憋屈感了!Instagram的模态窗口确实有点“矫情”,尤其是它的DOM结构经常偷偷更新,咱们一步步来解决这俩问题。
先搞定XPATH定位失败的问题
Instagram的订阅者模态窗口经常用动态生成的类名,你要是直接抄浏览器控制台里的XPATH,大概率过会儿就失效了。给你几个靠谱的定位思路:
用稳定的属性替代动态类名:模态窗口通常带有
role="dialog"属性,而且里面肯定有个显示“Followers”的标题,咱们可以结合这俩来定位,XPATH写法是://div[@role='dialog' and .//h2[contains(text(), 'Followers')]]这个写法比依赖类名稳定多了,毕竟Instagram总不能随便改
role属性和标题文本吧。一定要等元素加载完全:别刚点开订阅者按钮就急着定位,给页面留点加载时间,用
WebDriverWait显式等待比硬sleep靠谱:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 15) modal = wait.until(EC.visibility_of_element_located( (By.XPATH, "//div[@role='dialog' and .//h2[contains(text(), 'Followers')]]") ))排查是不是定位到了重复元素:如果还是找不到,你可以用
find_elements代替find_element,打印出所有匹配的元素,看看是不是定位到了页面上其他类似的对话框。
再解决滚动加载所有订阅者的问题
直接给页面发PAGE_DOWN大概率没用,因为焦点不在模态窗口的滚动容器里。正确的做法是定位到模态里的滚动列表容器,然后用JavaScript来触发滚动:
完整的滚动加载代码示例
import time import random # 先定位到刚才的模态窗口(上面已经搞定了) scroll_container = modal.find_element(By.XPATH, ".//div[contains(@style, 'overflow-y: scroll')]") # 初始化滚动高度 last_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) while True: # 滚动到容器底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container) # 随机延迟,避免触发反爬机制 time.sleep(random.uniform(2, 3.5)) # 获取新的滚动高度 new_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) # 如果高度不变,说明没有新订阅者了,退出循环 if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height print("所有订阅者都加载完啦!")
额外提醒
- 反爬注意:别把循环里的延迟设得太短,频繁滚动很容易被Instagram限制甚至封号,用随机延迟能降低被检测的概率。
- 如果还是找不到滚动容器:可以打开浏览器控制台,在订阅者模态里找带有
overflow-y: scroll样式的div,或者直接找列表的父容器,用更精准的XPATH定位。
备注:内容来源于stack exchange,提问作者san1rope
相关产品推荐
相关产品推荐

