Python 用于创建列表并在爬网结束时写入文件的碎片项目管道
我在做一个很难完成的项目,在这个项目中,我正在删除指定的有日期的项目。我设置了一个管道函数来将项目写入一个文件,但是我想为20个最旧的项目创建一个单独的文件,但是,我遇到了一些困难 问题在于访问类中创建的最旧项的列表。似乎我无法将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
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应该是完全可以访问的