刮擦请求方法‘;s元参数是浅拷贝,;但是请求方法‘;s meta args在scrapy_redis中是深度复制。为什么?

刮擦请求方法‘;s元参数是浅拷贝,;但是请求方法‘;s meta args在scrapy_redis中是深度复制。为什么?,scrapy,Scrapy,scrapy: import scrapy from scrapy.spider import Request class TestspiderSpider(scrapy.Spider): name = 'testspider' allowed_domains = ['mzitu.com'] start_urls = ['http://www.mzitu.com/'] def start_requests(self): L =[]

scrapy:

import scrapy
from  scrapy.spider import Request

class TestspiderSpider(scrapy.Spider):
    name = 'testspider'
    allowed_domains = ['mzitu.com']
    start_urls = ['http://www.mzitu.com/']

    def start_requests(self):
        L =[]
        print("L-id:",id(L),"first")
        yield Request(url="http://www.mzitu.com/5675",callback=self.parse,meta={"L":L},dont_filter=True)
    def parse(self, response):
        L = response.meta.get('L')
        print("L-id:", id(L),"second")
输出:

import scrapy
from  scrapy.spider import Request

class TestspiderSpider(scrapy.Spider):
    name = 'testspider'
    allowed_domains = ['mzitu.com']
    start_urls = ['http://www.mzitu.com/']

    def start_requests(self):
        L =[]
        print("L-id:",id(L),"first")
        yield Request(url="http://www.mzitu.com/5675",callback=self.parse,meta={"L":L},dont_filter=True)
    def parse(self, response):
        L = response.meta.get('L')
        print("L-id:", id(L),"second")
身份证号码:2769118042568第一

L-id:2769118042568秒

他们是平等的

这是浅显的副本

scrapy\u redis

from scrapy_redis.spiders import RedisSpider
from scrapy.spider import Request

class MzituSpider(RedisSpider):   #scrapy_redis
    name = 'mzitu'
    redis_key = 'a:a'             #this is discard
    def start_requests(self):     #Because Rewrite the method of RedisSpider
        L =[]
        print("L-id:",id(L),"first")
        yield Request(url="http://www.mzitu.com/5675",callback=self.parse,meta={"L":L},dont_filter=True)
    def parse(self, response):
        L = response.meta.get('L')
        print("L-id:", id(L),"second")
输出:

import scrapy
from  scrapy.spider import Request

class TestspiderSpider(scrapy.Spider):
    name = 'testspider'
    allowed_domains = ['mzitu.com']
    start_urls = ['http://www.mzitu.com/']

    def start_requests(self):
        L =[]
        print("L-id:",id(L),"first")
        yield Request(url="http://www.mzitu.com/5675",callback=self.parse,meta={"L":L},dont_filter=True)
    def parse(self, response):
        L = response.meta.get('L')
        print("L-id:", id(L),"second")
L-id:1338857992

第一个L-id:1338858312第二个

他们不平等

这是深度复制

问题:

我想知道为什么

我该怎么解决呢

让粗糙的redis变为浅拷贝


这与以下事实有关:
scrapy redis
使用自己的调度程序类,该类通过redis序列化/反序列化所有请求,然后将它们进一步推送到下载程序(它在redis上保留一个队列)。没有“简单”的方法来解决这个问题,因为它基本上是scrapy redis的核心功能。我的建议是不要在meta中放入太多运行时敏感的内容,因为这在scrapy中通常不是最好的主意

谢谢你的回答,但是我想把一些运行时敏感的参数,比如list,从这个级别转移到下一个级别,然后我在下一个级别的列表中添加一些参数,最后,我将我的项目“屈服”到pipeline@JKingKong,您真的确定它对运行时敏感吗?通常,当您从一个请求到另一个请求依次更新元中的一个项时,允许它被复制/序列化就可以了,当进一步传递链时,您的项被深度复制的问题到底是什么?另外,我想问一下,您是使用多个蜘蛛实例同时运行还是只使用一个蜘蛛实例?仅使用一个蜘蛛实例。我的项目:####(title=scrapy.Field()#pictures'title)###(url=scrapy.Field()#第一个网页url)#####(img#u list#u url=scrapy.Field()#这是一个列表,当我分页时,程序将获得一个img_url放在列表中,直到最后一页,然后项目将保存到mongodb。)#######################在scrapy中,通过it@JKingKong,那么,在将项目推送到mongo之前,您是否仅使用redis临时存储项目?如果是,请禁用(注释掉)scrapy redis提供的SCHEDULER和DUPEFILTER_类设置。我想使用scrapy_redis实现分布式爬虫程序,但我在这个问题上失败了,因为我不知道如何处理项目结构