Scrapy中使用FormRequest无法填充登录表单的问题
排查Scrapy FormRequest登录失败的问题
我来帮你梳理几个常见的导致登录失败的原因,结合你的代码一步步排查:
修正URL的转义问题
你代码里的URL包含&,这是HTML转义后的字符,实际请求时应该用&才能让服务器正确解析参数。把URL改成:"https://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none"添加模拟浏览器的请求头
很多网站会校验User-Agent、Referer这类请求头,Scrapy默认的头太“机器化”容易被拦截。可以在请求里单独添加,也可以在settings.py全局配置: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://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none' } yield FormRequest( url="https://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none", method="POST", formdata=data, headers=headers, callback=self.parse_after_login )检查是否遗漏隐藏表单字段
多数登录页面会包含CSRF Token或其他隐藏字段(比如__RequestVerificationToken),这些是必须提交的。你需要先请求登录页面提取这些字段,再一起提交:def start_requests(self): # 先请求登录页面获取隐藏字段 yield scrapy.Request( url="https://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none", callback=self.parse_login_page ) def parse_login_page(self, response): # 提取CSRF Token(根据页面实际字段名调整) csrf_token = response.css('input[name="csrfToken"]::attr(value)').get() data = { 'loginName': 'g2387744@nwytg.com', 'password' : '123456789', 'rememberme' : 'true', 'csrfToken': csrf_token # 添加隐藏字段 } 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' } yield FormRequest( url="https://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none", method="POST", formdata=data, headers=headers, callback=self.parse_after_login )确认接口的Content-Type要求
如果这个登录接口接收JSON格式数据而非表单编码,FormRequest的formdata就不适用了,需要用body传递JSON字符串:import json data = { 'loginName': 'g2387744@nwytg.com', 'password' : '123456789', 'rememberme' : 'true' } 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', 'Content-Type': 'application/json' } yield scrapy.Request( url="https://ecustomermw.colruytgroup.com/ecustomermw/v1/fr/customer/logon?client=cogo_cogo&variant=none", method="POST", body=json.dumps(data), headers=headers, callback=self.parse_after_login )查看响应内容找具体线索
不管登录成功与否,先打印响应内容看看服务器的反馈,比如是否提示验证码错误、IP受限,甚至测试账号是否有效:def parse_after_login(self, response): print(response.text) # 如果是JSON响应就用下面的 # print(response.json())
按照这些步骤排查,应该能定位到登录失败的具体原因。
内容的提问来源于stack exchange,提问作者parik
相关产品推荐
相关产品推荐

