Scrapy爬取银行网站时登录后立即重定向至登出页面问题求助
解决Scrapy登录银行网站后立即登出的问题
我之前爬取金融类网站时也碰到过一模一样的情况——登录请求返回200,但紧接着就被踢回登录页,根本拿不到数据。结合你的日志和这类网站的特性,大概率是会话维持或反爬验证没处理到位,给你几个排查方向:
1. 确保Cookie被正确传递和持久化
银行网站几乎全靠Cookie维持登录会话,Scrapy默认虽然启用Cookie,但有时候会因为请求构造问题导致Cookie没跟上。
- 先在
settings.py里开启Cookie调试,方便排查:COOKIES_ENABLED = True COOKIES_DEBUG = True - 登录请求尽量用
FormRequest.from_response,它会自动继承之前请求的Cookie,还能帮你提取表单里隐藏的字段(比如CSRF Token),比手动写FormRequest靠谱得多:def parse(self, response): # 先访问登录页,获取必要的Cookie和表单字段 return scrapy.Request(url='https://www.bank.org/signin-page.html', callback=self.parse_login) def parse_login(self, response): # 用from_response构造登录请求 return scrapy.FormRequest.from_response( response, formdata={ 'username': '你的账号', 'password': '你的密码' # 如果有其他必填字段(比如验证码,不过你没提,暂时忽略) }, callback=self.parse_after_login ) def parse_after_login(self, response): # 这里检查是否登录成功,比如看页面是否包含用户名 if '欢迎回来' in response.text: # 登录成功,开始爬取数据 yield scrapy.Request(url='https://www.bank.org/your-target-page', callback=self.parse_data) else: # 登录失败,打印响应内容排查 print('登录失败,响应内容:', response.text)
2. 检查CSRF Token是否正确携带
很多银行网站的登录表单里会有隐藏的CSRF Token字段,如果你手动构造POST请求没带上它,就算密码正确,服务器也会拒绝维持会话。用from_response的话,它会自动提取表单里的Token并加入请求数据,这一步基本能避免这个问题。
3. 模拟真实浏览器的User-Agent
默认的Scrapy User-Agent太扎眼,很容易被网站的反爬机制识别并强制登出。在settings.py里换成一个真实浏览器的UA:
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
4. 模拟真实用户的请求节奏
银行网站对异常请求很敏感,如果登录后立刻发起大量请求,或者请求间隔太短,会被判定为机器人并强制登出。可以在settings.py里设置合理的下载延迟:
DOWNLOAD_DELAY = 2 # 每次请求间隔2秒
另外,登录成功后先访问一下网站的主页,再逐步爬取目标数据,尽量贴合真实用户的操作路径。
补充排查建议
你提供的日志只显示了登录POST请求返回200,建议把登录后的请求日志也贴出来——如果后续请求返回302重定向到登录页,那基本就是会话丢失;如果返回200但内容还是登录页,那可能是反爬机制直接拦截了请求。
内容的提问来源于stack exchange,提问作者Matt Turner
相关产品推荐
相关产品推荐

