You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Instagram帖子链接遇问题:元素过期及By未定义

解决Instagram帖子链接爬取的NameError及加载中断问题

首先,你遇到的NameError: name 'By' is not defined是因为没有导入Selenium的By类,这是使用By.CSS_SELECTOR等定位方式的必要前提。先把这个基础问题解决:

第一步:导入必要的模块

确保你的代码顶部包含这些导入:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By  # 这行是你缺失的关键!

第二步:修正WebDriverWait的使用逻辑

你原来的代码里直接把posts传给WebDriverWait是错误的,WebDriverWait需要接收的是浏览器驱动实例(browser),而不是元素列表。另外,原来的滚动循环可能导致元素还没加载完成就被提取,从而引发中断。我们可以结合滚动+等待的方式,确保所有帖子都加载出来:

改进后的完整代码示例

# 初始化浏览器驱动(Selenium 4.x无需手动指定chromedriver路径,会自动管理)
browser = webdriver.Chrome()
instagram_page = "你的目标Instagram账户URL"
browser.get(instagram_page)

# 滚动页面加载所有帖子
last_height = browser.execute_script("return document.body.scrollHeight")
scroll_count = 0  # 设置滚动次数限制,避免无限加载
while True:
    # 滚动到页面底部
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待新内容加载完成
    WebDriverWait(browser, 10).until(
        lambda driver: driver.execute_script("return document.body.scrollHeight") > last_height
    )
    last_height = browser.execute_script("return document.body.scrollHeight")
    
    # 滚动5次后停止(可根据需求调整次数)
    scroll_count += 1
    if scroll_count >= 5:
        break

# 等待所有帖子元素加载完成,然后提取链接
try:
    # 注意:Instagram页面结构会更新,需用浏览器F12查看真实的帖子容器选择器
    posts = WebDriverWait(browser, 15).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div._aabd._aa8k._aanf"))
    )
    # 提取每个帖子的链接
    links = [post.find_element(By.CSS_SELECTOR, "a").get_attribute('href') for post in posts]
    print(links)
finally:
    browser.quit()

关键注意事项

  • CSS选择器的准确性:Instagram的页面结构经常更新,你需要用浏览器开发者工具(F12)查看当前帖子容器的真实CSS类名,替换示例中的选择器。比如当前帖子外层容器常用div._aabd._aa8k._aanf,内部的<a>标签就是帖子链接。
  • 滚动停止条件:Instagram会无限加载旧帖子,所以必须设置合理的停止条件(比如滚动次数、加载时间,或者判断是否没有新内容加载),避免无限循环。
  • Selenium版本兼容:Selenium 4.x已弃用find_elements_by_xpath这类旧方法,推荐使用find_element(By.XPATH, "xxx")的新语法,这也是必须导入By类的原因。

为什么你原来的代码会中断?

你原来的代码直接在滚动后累加posts,然后提取链接,没有等待元素完全加载,可能导致某些elem找不到<a>标签,引发NoSuchElementException;同时因为没导入By类,使用By.CSS_SELECTOR时触发NameError。通过WebDriverWait等待元素出现,可以避免这类加载不完整的问题。

内容的提问来源于stack exchange,提问作者Karina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:42:40