【问题标题】:Python Scrapy function to be called just before spider_closed signal sent?在spider_close信号发送之前调用Python Scrapy函数?
【发布时间】:2012-10-24 10:12:19
【问题描述】:

我使用 scrapy 编写了一个爬虫,它会向不同的站点发出一大堆 HtmlXPathSelector 请求。在(异步)满足每个请求后,它会在 .csv 文件中创建一行数据。不可能看到最后满足哪个请求,因为如果还没有提取数据,则重复请求(有时它会丢失几次数据)。即使我从一个整洁的列表开始,输出也很混乱,因为这些行是在提取数据后立即写入的。

现在我想根据一列对该列表进行排序,但在完成每个请求之后。 'spider_close'信号可以用来触发真正的函数吗?如下,我尝试将信号与调度程序连接,但这个函数似乎只打印出东西,而不是使用变量甚至调用其他功能。

def start_requests(self)
    ...  dispatcher.connect(self.spider_closed, signal=signals.engine_stopped) ....


def spider_closed(spider):
    print 'this gets printed alright'   # <-only if the next line is omitted...
    out = self.AnotherFunction(in)      # <-This doesn't seem to run

【问题讨论】:

  • 我认为您可以将多个函数附加到一个信号上。这会解决您的问题吗?
  • 实际上,您可以将函数链接到信号...我相信我的实际问题是“scrapy”的结构 - 这是通过创建一个 .py 文件来解决的首先是spider,然后对输出文件进行排序。这非常有帮助:snipplr.com/view/67012/…
  • 不应该 dispatcher.connect(...) 在 __init__() 而不是 start_requests() 中?

标签: python signals scrapy web-crawler


【解决方案1】:

我拼凑了一个管道来为你解决这个问题。

文件:Project.middleware_module.SortedCSVPipeline

import csv
from scrapy import signals


class SortedCSVPipeline(object):

    def __init__(self):
        self.items = []
        self.file_name = r'YOUR_FILE_PATH_HERE'
        self.key = 'YOUR_KEY_HERE'

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_closed(self, spider):
        for item in sorted(self.items, key=lambda k: k[self.key]):
            self.write_to_csv(item)

    def process_item(self, item, spider):
        self.items.append(item)
        return item

    def write_to_csv(self, item):
       writer = csv.writer(open(self.file_name, 'a'), lineterminator='\n')
       writer.writerow([item[key] for key in item.keys()])

文件:settings.py

ITEM_PIPELINES = {"Project.middleware_module.SortedCSVPipeline.SortedCSVPipeline" : 1000}

运行此程序时,您将不再需要使用项目导出器,因为此管道将为您完成 csv 写入。此外,您的设置中管道条目中的 1000 需要比您要在此之前运行的所有其他管道更高的值。我在我的项目中对此进行了测试,结果生成了一个按我指定的列排序的 csv 文件!高温

干杯

【讨论】:

  • 好吧,我没有注意到这是 2012 年的……希望它对某人有所帮助,哈哈
  • 感谢您恢复这个,哈哈 - 不再有这个项目了,但我相信这会奏效
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2015-08-08
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多