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

Scrapy发送POST请求遇400错误,请求协助排查问题

问题排查与修复方案

核心错误原因

  • 错误的请求头字段:你在headers里添加了"POST":"/en/search-store HTTP/2",这属于HTTP请求行的内容,并非请求头字段。Scrapy会通过method和url参数自动处理请求行,手动添加该字段会导致服务器解析请求出错,返回400状态码。
  • 硬编码Content-Length:手动设置"Content-Length":"11"存在风险,一旦body内容调整,长度就会不匹配,服务器会直接拒绝请求。Scrapy会自动计算并添加该请求头,无需手动指定。
  • Referer不匹配:所有请求的Referer都硬编码为统一的https://www.azadea.com/en/store-locator,但针对不同国家(如kw、lb)的请求,Referer应对应地区专属的门店定位页面(例如https://www.azadea.com/kw/en/store-locator),不匹配的Referer可能触发服务器验证机制。

修复后的代码

class Azadea(scrapy.Spider):
    name = "azadea_stores"
    countries = ["", "kw/", "lb/", "qa/"]

    # 修正后的基础请求头,移除错误字段和自动处理的字段
    base_headers = {
        "Accept": "*/*",
        "Accept-Language": "en-US,en;q=0.5",
        "Accept-Encoding": "gzip, deflate, br",
        "Origin": "https://www.azadea.com",
        "Connection": "keep-alive",
        "Sec-Fetch-Dest": "empty",
        "Sec-Fetch-Mode": "no-cors",
        "Sec-Fetch-Site": "same-origin",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "X-Requested-With": "XMLHttpRequest",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
    }

    def start_requests(self):
        for country in self.countries:
            # 构造对应地区的请求URL和Referer
            url = f"https://www.azadea.com/{country}en/search-store"
            referer = f"https://www.azadea.com/{country}en/store-locator"
            
            # 复制基础头并添加当前请求的Referer
            headers = self.base_headers.copy()
            headers["Referer"] = referer

            yield scrapy.FormRequest(
                url=url,
                headers=headers,
                formdata={"q": "a", "start": "0"},
                callback=self.parse,
                method="POST"
            )

    def parse(self, response):
        # 处理返回的响应数据示例
        self.logger.info(f"Received response from {response.url}")
        # 若返回JSON格式数据,可解析:
        # data = response.json()
        # 后续数据提取逻辑...

额外注意事项

  • Cookie验证:部分网站要求请求携带初始页面的Cookie,建议先发送GET请求访问对应地区的store-locator页面,获取Cookie后再发送POST请求。可在start_requests中先yield GET请求,在回调中处理Cookie后再发起POST请求。
  • User-Agent:若修复后仍有问题,可在请求头中添加真实的浏览器User-Agent,避免被识别为爬虫。

内容的提问来源于stack exchange,提问作者ronitgupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:48