使用Scrapy爬取Foodpanda时无法获取准确配送费的问题排查
排查Foodpanda新加坡站点配送费爬取不符的思路
核对API请求参数的完整性
打开浏览器DevTools捕获网页加载时的真实API请求,将其Query参数与你的form_data逐一对比:- 检查是否遗漏关键参数,比如
currency、postal_code、customer_type等,部分参数可能直接影响配送费计算逻辑; - 验证
dynamic_pricing参数:当前设为'0',尝试改为'1'或直接移除该参数测试,部分场景下动态定价规则会随参数开关调整返回值。
- 检查是否遗漏关键参数,比如
对齐会话相关请求头与参数
dps-session-id:直接复制浏览器请求中的该字段值到爬虫代码中测试,会话ID可能关联地区偏好、动态定价策略,不一致会导致返回数据差异;- 补充缺失的请求头:添加浏览器真实的
User-Agent、Cookie、Referer、X-Requested-With等字段,尤其是Cookie,即使未登录状态下浏览器也会携带会话Cookie,缺失可能触发不同的定价逻辑。
校验API返回字段的正确性
查看API返回的JSON数据,确认你提取的配送费字段是否与网页展示一致:- 部分商家会返回多个费用字段,比如
delivery_fee(基础配送费)、discounted_delivery_fee(折扣后配送费)、service_fee(服务费),需确认网页展示的是哪一项; - 检查数值单位:部分API会以“分”为单位返回(如299代表$2.99),若错误将其按“元”处理会导致数值偏差。
- 部分商家会返回多个费用字段,比如
细化地理位置参数校验
- 确保经纬度的字符串格式与浏览器完全一致,比如浏览器传
1.4303500,爬虫不要只传1.43035; - 若网页请求中包含
postal_code参数,需添加到form_data中,Foodpanda可能结合邮编而非仅经纬度计算配送费。
- 确保经纬度的字符串格式与浏览器完全一致,比如浏览器传
调整请求构造方式
当前使用scrapy.FormRequest发送GET请求,虽会自动将formdata转为Query参数,但建议改用scrapy.Request直接构造带Query参数的URL,避免格式转换可能的问题:import urllib.parse api_url = 'https://disco.deliveryhero.io/listing/api/v1/pandora/vendors' form_data = { # 你的参数... } query_string = urllib.parse.urlencode(form_data) full_url = f"{api_url}?{query_string}" return scrapy.Request( full_url, headers=headers, meta={ # 你的meta参数... }, callback=self.parse_search )
内容的提问来源于stack exchange,提问作者Shivanshu
相关产品推荐
相关产品推荐

