如何利用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
相关产品推荐
相关产品推荐

