Python Scrapy:TypeError:';请求';对象是不可编辑的
我正在用Scrapy(1.1.2)制作一个蜘蛛来报废产品。我设法让它工作并收集了足够的数据,但现在,我想让每个元素向Python Scrapy:TypeError:';请求';对象是不可编辑的,python,python-2.7,scrapy,scrapy-spider,Python,Python 2.7,Scrapy,Scrapy Spider,我正在用Scrapy(1.1.2)制作一个蜘蛛来报废产品。我设法让它工作并收集了足够的数据,但现在,我想让每个元素向产品页面发出新的请求,并收集数据,例如产品描述 首先,这是我最后的工作代码 spider.py(除外) 输出 [ { "category": "Category Name", "price": 220000, "meta": { "baseURL": "", "name": "", "store"
产品页面
发出新的请求,并收集数据,例如产品描述
首先,这是我最后的工作代码
spider.py(除外)
输出
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name"
},
"reference": "100XXX100"
},
...
]
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name",
"product_page": "<div> [...] </div>"
},
"reference": "100XXX100"
},
...
]
在阅读了文档和这里的一些答案之后,我修改了get\u meta
方法,并为请求get\u product\u页面添加了一个回调
:
新的\u spider.py(除外)
预期产出
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name"
},
"reference": "100XXX100"
},
...
]
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name",
"product_page": "<div> [...] </div>"
},
"reference": "100XXX100"
},
...
]
我找不到有关此错误的任何信息,请帮助我修复它
非常感谢。您遇到的错误(TypeError:“Request”对象不可编辑
)是因为Request
实例被放入项的字段(在更新的get\u meta
方法函数中),而提要导出器无法序列化它
您需要将get meta请求返回给Scrapy,并使用一个元参数来传递半解析的项。下面是更新的parse
方法和新的parse\u get\u meta
方法的示例:
def parse(self, response):
for sel in response.xpath("a long string"):
mainloader = ProductLoader(selector=sel)
mainloader.add_value('category', 'Category Name')
#mainloader.add_value('meta', self.get_meta(sel))
# more data
item = mainloader.load_item()
get_meta_req = self.get_meta(sel)
get_meta_req['meta']['item'] = item
yield get_meta_req.replace(callback=self.parse_get_meta)
def parse_get_meta(self, response):
"""Parses a get meta response"""
item = response.meta['item']
# Parse the response and load the data here, e.g. item['foo'] = bar
pass
# Finally return the item
return item
另请参见:在哪里调用
get\u meta
?您是否尝试在项目管道中返回新的请求对象?抱歉,我在项目字段get\u meta
中添加了缺少的调用meta
。这两种方法parse\u get\u meta
和get\u product\u page
重叠,因此在我的代码中调整您的方法很混乱,引擎实际上正在发送请求,但没有检索任何内容。所有键对齐后的输出略有不同,因为我还必须修改items.py
中的Item类。我有没有提到它是有效的。
def parse(self, response):
for sel in response.xpath("a long string"):
mainloader = ProductLoader(selector=sel)
mainloader.add_value('category', 'Category Name')
#mainloader.add_value('meta', self.get_meta(sel))
# more data
item = mainloader.load_item()
get_meta_req = self.get_meta(sel)
get_meta_req['meta']['item'] = item
yield get_meta_req.replace(callback=self.parse_get_meta)
def parse_get_meta(self, response):
"""Parses a get meta response"""
item = response.meta['item']
# Parse the response and load the data here, e.g. item['foo'] = bar
pass
# Finally return the item
return item