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

Scrapy发送FormRequest POST表单请求后响应无数据如何解决?

问题排查与解决方案

根因定位

  • 缺少前置会话校验:该站点要求用户先通过GET请求访问行情页面获取有效会话Cookie,直接发起POST提交表单会被服务端拦截,返回无有效数据的空白页面
  • 请求头缺失异步标识:站点的表单提交走AJAX异步链路,缺少X-Requested-With: XMLHttpRequest请求头会被服务端判定为非法请求
  • 响应内容格式不匹配:如果接口返回的是JSON数据或者数据嵌入在JS变量中,直接用view(response)渲染HTML页面无法展示结构化的目标数据

修复方案

调整请求逻辑,先发起GET请求获取会话Cookie后再提交表单,补全必要请求头,代码如下:

import scrapy
from scrapy import FormRequest
from scrapy.shell import inspect_response

class VdscSpider(scrapy.Spider):
    name = 'vdsc'
    start_urls = ['https://livedragon.vdsc.com.vn/general/intradayBoard.rv']

    def start_requests(self):
        # 先发起GET请求获取会话Cookie
        yield scrapy.Request(
            url=self.start_urls[0],
            callback=self.submit_form
        )

    def submit_form(self, response):
        headers= {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            # 补全AJAX请求标识
            "X-Requested-With": "XMLHttpRequest"
        }
        formdata = {
            "stockCode": "AAA",
            "boardDate": "12/11/2021"
        }
        yield FormRequest(
            url='https://livedragon.vdsc.com.vn/general/intradayBoard.rv',
            headers=headers,
            formdata=formdata,              
            callback=self.parse_item
        )

    def parse_item(self, response):
        # 先打印原始响应内容确认是否有数据
        print("响应内容预览:", response.text[:500])
        inspect_response(response, self)

验证步骤

  • 进入scrapy shell交互界面后,先执行print(response.text)查看原始返回内容,确认是否包含股票交易数据
  • 若返回为JSON格式,可直接调用response.json()解析提取字段
  • 若数据嵌入在HTML的JS代码中,可通过正则或xpath提取JS内容后解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:05