使用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
相关产品推荐
相关产品推荐

