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

Scrapy爬取habermeyer.de时的分页POST请求问题排查

Scrapy爬取habermeyer.de分页问题

我用Scrapy爬取habermeyer.de的数据,分类和产品遍历操作都很顺利,但分页逻辑始终无法正确处理。

通过浏览器分析分页机制发现:点击「查看更多商品」按钮时,页面会发送携带表单数据的POST请求,返回包含新商品的HTML;所需表单数据已注入按钮的data-search-params属性中,可直接提取并序列化为JSON。

以该网站的「Rennbahnen, RC & Modellbau」分类页面为例,我从Chrome开发者工具复制了手动分页时的表单数据,在Scrapy Shell中编写了如下测试脚本:

from scrapy.http import FormRequest

pagination_api_url = "https://www.habermeyer.de/spielwaren-habermeyer-ek-neuburgdonau/search/navigationasn"
form_data = {
  'factFinderSearchParameters': {
    'filters': [
      {
        'name': 'CategoryPath',
        'substring': False,
        'values': [{'exclude': False, 'type': 'or', 'value': ['Rennbahnen, RC & Modellbau']}]
      }  
    ],
    'hitsPerPage': 24,
    'marketIds': ['400866330'],
    'page': 3,
    'query': '*'
  },
  'useAsn': '0'
}
headers = {
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://www.habermeyer.de",
    "Referer": "https://www.habermeyer.de/spielwaren-habermeyer-ek-neuburgdonau/k/rennbahnen-rc-modellbau",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
}
r = FormRequest(pagination_api_url, formdata=form_data, headers=headers)
# fetch(r)

注:必须将useAsn的值转为字符串类型,否则会触发「TypeError: to_bytes must receive a str or bytes object, got int」错误。

该请求返回HTTP 200状态码,但返回的HTML显示无搜索结果。

作为对比测试,我直接从Chrome开发者工具复制编码后的表单数据,传入简单的POST请求:

from scrapy import Request

encoded_form_data = "factFinderSearchParameters=%7B%22filters%22%3A%5B%7B%22name%22%3A%22CategoryPath%22%2C%22substring%22%3Afalse%2C%22values%22%3A%5B%7B%22exclude%22%3Afalse%2C%22type%22%3A%22or%22%2C%22value%22%3A%5B%22Rennbahnen%2C+RC+%26+Modellbau%22%5D%7D%5D%7D%5D%2C%22hitsPerPage%22%3A24%2C%22marketIds%22%3A%5B%22400866330%22%5D%2C%22page%22%3A3%2C%22query%22%3A%22*%22%7D&useAsn=0"
r = Request(pagination_api_url, method="POST", body=encoded_form_data, headers=headers)
# fetch(r)

此次请求成功返回了包含新商品的预期HTML内容。

我还尝试将初始JSON格式的表单数据编码后传入请求,同样返回HTTP 200但无结果:

from urllib.parse import urlencode

encoded_form_data = urlencode(form_data)
r = Request(pagination_api_url, method="POST", body=encoded_form_data, headers=headers)
# fetch(r)

环境版本:Python 3.10.6,Scrapy 2.8.0


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:35:00