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

Scrapy无法获取嵌套层级数据:原因及解决方法求助

问题分析与解决办法

可能的原因

  1. 直接yield列表而非单个条目:Scrapy的parse方法期望yield单个可处理对象(如字典、Item实例),直接yielddata['data']['ads']这个列表时,Scrapy无法正确迭代处理,导致看起来“失效”。
  2. JSON结构或键名异常:虽然能获取第一层数据,但可能data['data']['ads']本身是空列表,或者键名拼写错误(比如实际是'Ads'而非'ads')。
  3. 请求头缺失导致数据未返回:部分API会校验请求头(如User-Agent),虽然能拿到基础的metadata,但核心的ads数据被反爬策略拦截返回空值。

解决步骤

1. 先验证数据是否存在

在代码中添加打印语句,确认data['data']['ads']的实际内容:

def parse(self, response):
    data = response.json()  # 用response.json()替代json.loads更可靠,自动处理编码
    print("Ads数据:", data.get('data', {}).get('ads'))  # 用get避免KeyError
    # 原yield语句

运行爬虫后查看控制台输出,如果打印结果是[](空列表),说明API返回的ads本身为空;如果抛出KeyError,说明键名有误,需要核对JSON结构。

2. 遍历列表逐个yield条目

如果ads是包含多个广告字典的列表,需要遍历后逐个yield:

def parse(self, response):
    data = response.json()
    ads_list = data.get('data', {}).get('ads', [])
    for ad_item in ads_list:
        # 可直接yield字典,或封装成Scrapy Item
        yield ad_item

这样Scrapy能正确处理每个条目,数据会被传递到Pipeline或导出到文件。

3. 添加必要的请求头

如果验证后发现ads为空,大概率是反爬导致。可以在爬虫的start_requests方法中添加浏览器级别的User-Agent:

# 在爬虫类中重写start_requests
def start_requests(self):
    url = "https://bama.ir/cad/api/search?vehicle=pride%2C151%2Cse&pageIndex=1"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    yield scrapy.Request(url, headers=headers, callback=self.parse)

也可以在settings.py中全局设置:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'

4. 封装成Scrapy Item(可选)

如果需要规范数据结构,可先定义Item类:

# items.py
import scrapy

class BamaAdItem(scrapy.Item):
    title = scrapy.Field()
    price = scrapy.Field()
    # 根据实际ads中的字段添加其他字段

然后在parse方法中映射字段:

def parse(self, response):
    data = response.json()
    ads_list = data.get('data', {}).get('ads', [])
    for ad_item in ads_list:
        item = BamaAdItem()
        item['title'] = ad_item.get('title')
        item['price'] = ad_item.get('price')
        # 其他字段映射
        yield item

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:40:46