Python Requests在服务器无法获取Instagram账号数据的问题排查
问题分析与解决方案
核心原因
服务器环境的请求被Instagram识别为自动化/非浏览器请求,返回的页面内容与本地虚拟机存在差异,导致你依赖apparent_encoding的判断逻辑完全失效。Instagram会通过请求头(如默认的python-requests标识)、IP特征等识别自动化工具,服务器IP大概率已被纳入监控范围。
具体解决步骤
1. 添加浏览器模拟请求头
给请求添加真实浏览器的User-Agent,避免被直接识别为机器人:
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' }
请求时传入该参数:r = requests.get(f"https://www.instagram.com/{i}/", headers=headers)
2. 替换为更可靠的账号存在判断逻辑
依赖apparent_encoding的判断方式极不稳定,建议改用以下两种更可靠的方法:
- 检查页面是否包含不存在账号的固定标识文本(如
"Sorry, this page isn't available.") - 结合响应URL判断是否被重定向到登录页/非用户主页
修改后的完整代码示例:
import requests exist = [] url_list = [] cli = ["nike", "duolingo", "duolingoindo"] 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' } for username in cli: target_url = f"https://www.instagram.com/{username}/" try: r = requests.get(target_url, headers=headers, allow_redirects=True) # 检查是否被重定向到登录页,需额外处理验证 if "accounts/login" in r.url: print(f"{username}: 触发反爬,需验证") continue # 检查页面是否存在账号不存在的标识 if "Sorry, this page isn't available." not in r.text: exist.append(username) url_list.append(target_url) print(f"{username}: Exist") else: print(f"{username}: Not Exist") except Exception as e: print(f"{username}: 请求失败 - {str(e)}")
3. 处理IP限制问题
如果添加请求头后仍无效,大概率是服务器IP被Instagram限制:
- 使用代理IP分散请求来源
- 降低请求频率,避免短时间内批量请求触发反爬机制
4. 排查响应内容差异
在服务器上打印响应的前500个字符,对比本地虚拟机的响应内容,确认是否被拦截或返回了完全不同的页面:
print(r.text[:500])
通过直接对比内容,可以快速定位服务器请求是否被篡改。
内容的提问来源于stack exchange,提问作者THUnt
相关产品推荐
相关产品推荐

