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

如何利用Scrapy获取ReclameAqui平台的客户与企业互动回复?

解决方案

要获取每条投诉对应的客户与企业回复,你可以利用互动哈希值调用ReclameAqui的专用API接口,在Scrapy中通过嵌套请求实现。具体步骤如下:

1. 确定互动内容的API端点

互动内容的请求URL格式为:

https://iosearch.reclameaqui.com.br/raichu-io-site-search-v1/query/interactions/{interaction_hash}

其中{interaction_hash}就是每条投诉interactions数组中的哈希值(比如示例中的kAg79krfcjNpAXZ5)。

2. 修改爬虫代码

在现有代码基础上,添加嵌套请求和回调函数来处理互动内容:

import scrapy
from ..items import ComplaintItem
import json


class ComplaintScraper(scrapy.Spider):
    name = "complaintScraper"  

    start_urls = [f"https://iosearch.reclameaqui.com.br/raichu-io-site-search-v1/query/companyComplains/10/{item}?company=98" for item in range(0,100,10)]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, dont_filter=True)
  
    def parse(self, response):
        data = json.loads(response.text)
      
        for card in data['complainResult']['complains']['data']:
            complaintItem = ComplaintItem()
            complaintItem['id']               = card['id']
            complaintItem['title']            = card['title']   
            complaintItem['description']      = card['description']
            complaintItem['url']              = response.url
            # 初始化回复列表字段
            complaintItem['replies'] = []

            # 处理互动哈希值(可能存在多个,遍历处理)
            interaction_hashes = card.get('interactions', [])
            for hash_val in interaction_hashes:
                # 构造互动内容请求URL
                interaction_url = f"https://iosearch.reclameaqui.com.br/raichu-io-site-search-v1/query/interactions/{hash_val}"
                # 发送请求,通过meta传递当前的complaintItem
                yield scrapy.Request(
                    interaction_url,
                    callback=self.parse_interactions,
                    meta={'complaint_item': complaintItem},
                    dont_filter=True
                )
    
    def parse_interactions(self, response):
        # 从meta中取出之前的complaintItem
        complaintItem = response.meta['complaint_item']
        data = json.loads(response.text)

        # 解析互动内容中的回复
        for interaction in data.get('interactionResult', {}).get('interactions', []):
            # 区分是客户回复还是企业回复
            reply_type = 'customer' if interaction.get('userType') == 'CONSUMER' else 'company'
            reply_content = interaction.get('content')
            reply_date = interaction.get('createdAt')

            # 将回复信息添加到replies列表
            complaintItem['replies'].append({
                'type': reply_type,
                'content': reply_content,
                'date': reply_date
            })
        
        # 输出包含回复的投诉数据
        yield complaintItem

3. 关键说明

  • meta传递Item:通过meta参数将当前的ComplaintItem传递给回调函数,避免重复创建Item。
  • 多互动哈希值处理:部分投诉可能关联多个互动哈希值,需要遍历所有哈希值发送请求。
  • 回复类型区分:通过userType字段判断回复来自客户(CONSUMER)还是企业(COMPANY)。
  • 去重优化:如果同一投诉有多个互动哈希值,当前代码会多次输出Item。你可以通过在parse中初始化Item后,用计数跟踪请求完成数量,确保所有互动请求处理完毕后再输出最终的Item。

4. 更新Item定义

确保你的ComplaintItem中添加replies字段以存储回复列表:

import scrapy

class ComplaintItem(scrapy.Item):
    id = scrapy.Field()
    title = scrapy.Field()
    description = scrapy.Field()
    url = scrapy.Field()
    replies = scrapy.Field()  # 新增字段存储回复列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:05:38