You need to enable JavaScript to run this app. 使用Python requests连接Instagram采集数据被限制的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用Python requests连接Instagram采集数据被限制的问题咨询

现有代码核心问题
  • 请求逻辑顺序错误:先发起GET请求再创建Session、再发起登录请求,Session完全没有复用,登录请求也根本没有生效
  • 登录参数提交方式完全错误:Instagram不会从请求头中读取账号密码,且登录请求的地址不应该是用户个人主页
  • 没有处理平台反爬校验:缺少必要的csrf校验、请求头参数不完整,且未做请求频率控制,很容易触发平台限流封禁
解决思路

1. 正确实现Session登录流程

  • 全局复用同一个requests.Session()实例,所有请求都通过该实例发起,自动维护cookie、登录状态
  • 先请求Instagram首页获取csrftoken:首次访问首页后,从Session的cookie中取出csrftoken值
  • 登录请求提交到专门的登录接口https://www.instagram.com/accounts/login/ajax/,POST请求的data字段传入账号、密码相关参数,请求头额外添加X-CSRFToken字段传入之前拿到的csrftoken,同时保证User-Agent、Referer等请求头和浏览器行为一致

2. 优化采集逻辑

  • 登录成功后再发起用户主页的采集请求,不要每次采集都重复登录
  • 给请求添加随机间隔,单次请求间隔3-5秒以上,避免短时间内请求量过高触发限流
  • 优先用结构化接口获取数据:请求用户主页时添加?__a=1参数,可直接返回JSON格式的用户公开数据,不需要自己解析HTML标签,稳定性更高

3. 风险规避

  • 不要使用个人常用的Instagram账号做爬虫测试,避免账号被平台封禁
  • 若频繁触发IP限制,可搭配代理池使用,不同请求切换不同IP
注意事项
  • Instagram反爬机制更新频繁,上述方案仅做学习参考,无法保证长期可用
  • 采集公开数据请遵守平台使用协议及当地法律法规,不要用于非法用途
参考修改代码
from bs4 import BeautifulSoup
import requests
import time
import random

# 全局初始化Session
session = requests.Session()
# 统一配置请求头,和浏览器保持一致
BASE_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Referer': 'https://www.instagram.com/'
}
session.headers.update(BASE_HEADERS)

def insta_login(username, password):
    # 先请求首页拿csrftoken
    session.get('https://www.instagram.com/')
    csrftoken = session.cookies.get('csrftoken')
    # 构造登录请求
    login_url = 'https://www.instagram.com/accounts/login/ajax/'
    login_headers = {
        'X-CSRFToken': csrftoken
    }
    login_data = {
        'username': username,
        'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{int(time.time())}:{password}',
        'queryParams': {}
    }
    resp = session.post(login_url, headers=login_headers, data=login_data)
    if resp.json().get('authenticated'):
        print('登录成功')
        return True
    else:
        print('登录失败', resp.text)
        return False

def get_info_insta(username):
    # 用结构化接口拿数据
    url = f'https://www.instagram.com/{username}/?__a=1'
    # 加随机延迟
    time.sleep(random.randint(3,6))
    response = session.get(url)
    if response.status_code != 200:
        print(f'请求失败,状态码{response.status_code}')
        return None
    data = response.json()
    user_info = data['graphql']['user']
    followers = user_info['edge_followed_by']['count']
    following = user_info['edge_follow']['count']
    posts = user_info['edge_owner_to_timeline_media']['count']
    return {
        'username': username,
        'followers': followers,
        'following': following,
        'posts': posts
    }

if __name__ == '__main__':
    # 先登录,替换成你自己的测试账号密码,测试账号建议关闭二次验证
    if insta_login('你的测试账号', '你的测试密码'):
        user_data = get_info_insta('javascripthub')
        print(user_data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 19:54:03