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

Selenium爬取Instagram标签仅返回20条帖子链接问题求助

解决Instagram标签页仅获取20条帖子链接的问题

核心修改点:

  • 精准定位帖子链接
    原代码通过By.TAG_NAME, 'a'抓取所有<a>标签,会混入导航栏、标签介绍等非帖子链接,且容易遗漏加载后的新帖子。改用CSS选择器div._aabd._aa8k._aanf a直接定位帖子缩略图的容器链接(若Instagram页面结构更新,可通过浏览器开发者工具重新获取对应选择器),只抓取有效帖子链接。

  • 修复列表拼接错误
    原代码中links.append(slinks)会把新获取的链接列表作为单个元素嵌套进主列表,导致后续遍历筛选时出错。改为links.extend(slinks),将新链接直接追加到主列表中。

  • 替换固定等待为显式等待
    固定time.sleep()无法适配不同网络下的加载速度,改用WebDriverWait等待新帖子元素加载完成,直到页面中帖子数量超过当前已抓取的数量,确保新内容加载后再抓取,避免漏抓。

  • 优化滚动触发逻辑
    原固定距离滚动可能无法触发Instagram的无限加载机制,改为滚动到页面底部window.scrollTo(0, document.body.scrollHeight);,确保触发新帖子的加载请求。

  • 提前去重减少无效数据
    每次抓取链接后通过集合去重,避免重复添加同一帖子链接,提升后续处理效率。

修改后的完整代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import random
import pandas as pd
import time

for tag in tags:
    address = f'https://www.instagram.com/explore/tags/{tag}/'
    driver.get(address)
    
    # 等待初始帖子加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div._aabd._aa8k._aanf a"))
    )
    
    # 初始抓取帖子链接并去重
    alinks = driver.find_elements(By.CSS_SELECTOR, "div._aabd._aa8k._aanf a")
    links = list({link.get_attribute('href') for link in alinks if link.get_attribute('href').startswith('https://www.instagram.com/p/')})
    
    # 设置滚动加载次数,可根据需求调整
    scroll_count = 3
    for _ in range(scroll_count):
        # 滚动到页面底部触发加载
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        
        # 等待新帖子加载完成,直到帖子数量增加
        WebDriverWait(driver, 12).until(
            lambda d: len(d.find_elements(By.CSS_SELECTOR, "div._aabd._aa8k._aanf a")) > len(links)
        )
        
        # 随机等待避免反爬检测
        time.sleep(random.randint(2, 5))
        
        # 抓取新链接并合并去重
        new_alinks = driver.find_elements(By.CSS_SELECTOR, "div._aabd._aa8k._aanf a")
        new_links = [link.get_attribute('href') for link in new_alinks if link.get_attribute('href').startswith('https://www.instagram.com/p/')]
        links = list(set(links + new_links))
    
    # 转换为DataFrame并输出
    df = pd.DataFrame(links, columns=['post_url'])
    print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:45:15