使用Scrapy登录Instagram遭拦截,求可行登录方案
解决Instagram登录页面访问及Scrapy登录问题
第一步:绕过robots.txt限制
你的日志明确显示请求被robots.txt拦截,Scrapy默认会遵循网站的robots协议,直接修改配置关闭这个规则:
在Scrapy项目的settings.py中,修改:
ROBOTSTXT_OBEY = False
第二步:模拟真实请求环境
Instagram对请求特征检测严格,需要配置请求头模拟真实浏览器:
- 在
settings.py中添加自定义User-Agent(换成你常用浏览器的UA):
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
- 确保
settings.py中DOWNLOADER_MIDDLEWARES里的scrapy.downloadermiddlewares.cookies.CookiesMiddleware处于启用状态,用来维持会话。
第三步:正确的登录流程
Instagram的登录需要先获取登录页面的CSRF令牌,再提交POST请求:
def start_requests(self): login_url = 'https://www.instagram.com/accounts/login/' yield scrapy.Request( login_url, callback=self.parse_login, headers={'User-Agent': self.settings.get('USER_AGENT')} ) def parse_login(self, response): # 提取CSRF令牌,优先从meta标签取,没有就从cookie里拿 csrf_token = response.xpath('//meta[@name="csrf-token"]/@content').get() if not csrf_token: csrf_token = response.cookies.get('csrftoken') # 构造登录POST数据 login_data = { 'username': '你的Instagram账号', 'password': '你的Instagram密码', 'csrfmiddlewaretoken': csrf_token } # 提交登录请求,注意用ajax接口 yield scrapy.FormRequest( url='https://www.instagram.com/accounts/login/ajax/', formdata=login_data, callback=self.parse_after_login, headers={ 'User-Agent': self.settings.get('USER_AGENT'), 'X-CSRFToken': csrf_token, 'X-Requested-With': 'XMLHttpRequest' } ) def parse_after_login(self, response): # 检查登录结果,Instagram返回JSON格式响应 result = response.json() if result.get('authenticated'): # 登录成功,跳转目标页面爬取评论 yield scrapy.Request('目标帖子URL', callback=self.parse_comments) else: self.logger.error('登录失败:%s', result.get('message'))
额外注意事项
- 控制请求频率:在
settings.py设置DOWNLOAD_DELAY = 3,避免频繁触发反爬机制。 - 使用代理IP:如果IP被限制,配置代理中间件切换IP,降低账号或IP被封禁的风险。
- 处理验证环节:若遇到验证码或两步验证,需手动处理或借助验证码识别服务,这会增加爬取的复杂度。
内容的提问来源于stack exchange,提问作者Leo Torres
相关产品推荐
相关产品推荐

