Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于创建列表并在爬网结束时写入文件的碎片项目管道_Python_List_Scope_Web Crawler_Scrapy - Fatal编程技术网

Python 用于创建列表并在爬网结束时写入文件的碎片项目管道

Python 用于创建列表并在爬网结束时写入文件的碎片项目管道,python,list,scope,web-crawler,scrapy,Python,List,Scope,Web Crawler,Scrapy,我在做一个很难完成的项目,在这个项目中,我正在删除指定的有日期的项目。我设置了一个管道函数来将项目写入一个文件,但是我想为20个最旧的项目创建一个单独的文件,但是,我遇到了一些困难 问题在于访问类中创建的最旧项的列表。似乎我无法将self传递到spider\u closed函数中。它似乎只接受了一个参数——它响应关闭的蜘蛛 以下是我迄今为止为管道函数所做的尝试: class twentyOldest(object): def __init__(self): # con

我在做一个很难完成的项目,在这个项目中,我正在删除指定的有日期的项目。我设置了一个管道函数来将项目写入一个文件,但是我想为20个最旧的项目创建一个单独的文件,但是,我遇到了一些困难

问题在于访问类中创建的最旧项的列表。似乎我无法将
self
传递到
spider\u closed
函数中。它似乎只接受了一个参数——它响应关闭的蜘蛛

以下是我迄今为止为管道函数所做的尝试:

class twentyOldest(object):

    def __init__(self):

        # connect to spider_closed signal
        dispatcher.connect(self.spider_closed, spider_closed)

        # create list for storing oldest pages dics and values in item
        oldest = [{'lastUpdatedDateTime':datetime.today()}]

        # write table header
        line = "{0:15} {1:40} {2:} \n\n".format("Domain","Last Updated","URL")
        self.oldOutput.write(line)

    def process_item(self, item, spider):

        if item['group'] == "Old Page":
            itemAge = item['lastUpdatedDateTime']

            currentYoungest = max(x['lastUpdatedDateTime'] for x in self.oldest)

            # if item is older than youngest item in the list, remove that item (if list has more than 20 pages) and add the new one
            if itemAge < currentYoungest:
                if len(self.oldest) > 20:


                       # delete current 'youngest'
                        place = self.oldest.index(max(self.oldest, key=lambda x:x['lastUpdatedDateTime']))
                        del self.oldest[place]

                    # add new item
                    self.oldest.append(item)


            return item

        def spider_closed(SPIDER_NAME):

                # sort the array based on age
                oldest = sorted(oldest, key=lambda k: k['lastUpdatedDateTime']) 

                #open file for writing the list to
                oldOutput = open('twenty_oldest_pages.txt', 'wb')

                # write the dict to the file created
                for item in oldest:
                    line = "{0:15} {1:40} {2:} \n".format(item['domain'],item["lastUpdated"],item["url"])
                oldOutput.write(line)

            return item
第二十类(对象):
定义初始化(自):
#连接到十字轴,然后关闭信号
调度程序连接(self.spider\u关闭,spider\u关闭)
#创建用于在项目中存储最旧页面DIC和值的列表
最早的=[{'lastUpdatedDateTime':datetime.today()}]
#写表头
行=“{0:15}{1:40}{2:}\n\n”。格式(“域”、“上次更新”、“URL”)
self.oldOutput.write(行)
def过程_项目(自身、项目、蜘蛛):
如果项目['group']=“旧页”:
itemAge=item['LastUpdateDateTime']
currentMineet=max(x['lastUpdateDateTime']表示self.oldest中的x)
#如果项目比列表中最年轻的项目旧,请删除该项目(如果列表有20多页),然后添加新项目
如果项目年龄<当前年龄:
如果len(自己最老)>20:
#删除当前“最年轻的”
place=self.oldest.index(max(self.oldest,key=lambda x:x['lastUpdateDateTime']))
最古老的[地方]
#添加新项目
self.oldest.append(项)
退货项目
def卡盘_关闭(卡盘_名称):
#根据年龄对数组进行排序
最早=已排序(最早,键=lambda k:k['LastUpdateDateTime'])
#打开要将列表写入的文件
oldOutput=open('Tworth\u oldest\u pages.txt','wb')
#将dict写入创建的文件
对于最旧版本中的项目:
line=“{0:15}{1:40}{2:}\n”。格式(项['domain'],项['lastUpdated'],项['url'])
oldOutput.write(行)
退货项目
如上所述,问题发生在
spider_closed
函数中,因为它无法访问初始化中创建的列表

有人知道怎么解决这个问题吗?我对编程比较陌生,可能很容易错过一些简单的解决方案。非常感谢

请参阅scrapy文档,将您的
spider\u closed
功能更改为:

def close_spider(self, spider):
此外,无需监听close spider信号,close_spider函数将在默认情况下被调用(默认情况下)

使用默认的spider关闭功能self应该是完全可以访问的。

请参阅scrapy文档,将
spider关闭功能更改为:

def close_spider(self, spider):
此外,无需监听close spider信号,close_spider函数将在默认情况下被调用(默认情况下)

使用默认的spider关闭功能self应该是完全可以访问的。

请参阅scrapy文档,将
spider关闭功能更改为:

def close_spider(self, spider):
此外,无需监听close spider信号,close_spider函数将在默认情况下被调用(默认情况下)

使用默认的spider关闭功能self应该是完全可以访问的。

请参阅scrapy文档,将
spider关闭功能更改为:

def close_spider(self, spider):
此外,无需监听close spider信号,close_spider函数将在默认情况下被调用(默认情况下)

使用默认的close_spider函数self应该是完全可以访问的