You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:28:25