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
相关产品推荐
相关产品推荐

