Python Scrapy:TypeError:';请求';对象是不可编辑的

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"

我正在用Scrapy(1.1.2)制作一个蜘蛛来报废产品。我设法让它工作并收集了足够的数据,但现在,我想让每个元素向
产品页面
发出新的请求,并收集数据,例如产品描述

首先,这是我最后的工作代码

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