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

