python-3.x - 加载一系列有效负载请求并为每个请求执行分页
问题描述
您好我正在尝试发送一系列有效负载请求,并为每个请求执行分页。为了为每个“有效负载请求”实现这一点,应该增加一个变量“偏移量”。不幸的是,代码输出以下错误“TypeError:'bytes'对象不支持项目分配”。
# -*- coding: utf-8 -*-
import scrapy
import json
class KauflandBasicProductsSpider(scrapy.Spider):
name = 'kaufland_basic_products'
allowed_domains = ['www.shopme.io']
custom_settings = {'ITEM_PIPELINES': {'groceries.pipelines.BasicProducts': 365}}
categories = [
"8d7a9abf-b90b-4c07-9e18-ed2283dfd71f",
"24ddb04a-f9b9-44f8-b78d-00ef5cd79977",
"3502a7bd-7459-4a51-91df-17375b15e03e"
]
def start_requests(self):
for category_id in self.categories:
payload = {"category_id": category_id}
yield scrapy.Request(
url='www.shopme.io/v1/feed',
)
def parse(self, response):
payload_var = response.request.body
# offset_var = int(payload_var['offset'])
resp = json.loads(response.body)
# print(resp)
products = resp.get('feed').get('items')[0].get('items')
# # print(products)
for product in products:
yield{
'product' : product.get('name'),
'price' : product.get('price'),
'price_promo' : 'n/a',
'weight' : 'n/a',
'weight_text' : 'n/a',
# 'brand' : product.get('brand').get('name'),
'country_of_origin' : 'n/a',
'source' : product.get('vendor_name'),
'link' : product.get('image_url')
# 'current_page' : response.meta['current_page']
# 'user-agent' : response.get('User-Agent').decode('utf-8')
}
count_available_products = resp.get('feed').get('count')
# increment_number = len(resp.get('feed').get('items')[0].get('items'))
# if current_payload['offset'] <= count_available_products:
# current_payload['offset'] += increment_number
if count_available_products >= 12:
# offset_var += 12
offset_var = response.meta['offset']
offset_var += 12
payload_var['offset'] = offset_var
yield scrapy.Request(
url="https://disco.deliveryhero.io/verticals/api/v1/feed",
method="POST",
body=json.dumps(payload_var),
headers={
'Content-Type': 'application/json'
},
callback=self.parse
)
解决方案
您的问题的答案是,当您检索请求正文时,您有一个字节对象,而不是字典。这就是为什么你会得到一个TypeError
例外。
payload_var = response.request.body # This is a bytes object
...
payload_var['offset'] = offset_var # This raises an exception
解决方案是使用json.loads()
方法将其转换回字典。
payload_var = json.loads(response.request.body)
您还有其他选项可以避免此错误,将payload
其用作类变量(就像categories
)就是其中之一。
推荐阅读
- python - 我们可以使用 Keras 进行视频数据增强吗?
- python - 通过 pandas 绘图界面绘制带有第二个 y 轴的 pandas 数据框时设置图例位置
- quasar-framework - Quasar Framework:在 QLayoutHeader/QToolbar 中隐藏 QToolbarTitle
- pimcore - Pimcore CSV 从文件夹位置上传并自动创建数据对象
- java - 如何按照提交的顺序通过 websocket 代理在 Spring Boot 中发送消息?
- sql-server - Kafka Connect with MSSQL 不适用于删除操作
- docker - Docker:如何将容器内的 IP 重定向到另一个 IP
- angular - 禁用角度中的默认键值管道排序
- google-apps-script - 具有两个 onEdit 实例的共享电子表格,删除错误的行
- angular - Bootstrap 版本问题,从 bootstrap3 迁移到 boostrap4