2012-10-24 52 views
5

我寫了一個使用scrapy的蜘蛛,一個使得整個HtmlXPathSelector請求分離網站。它在每個請求(異步)滿足後在.csv文件中創建一行數據。無法看到最後滿足哪個請求,因爲如果尚未提取數據(有時會錯過數據數據),請求會重複。即使我從一個整齊的列表開始,由於在提取數據後立即寫入行,輸出混亂。Python Scrapy函數在spider_closed信號發送之前被調用?

現在我想根據一列對該列表進行排序,但是在每次請求完成後。 'spider_closed'信號可以用來觸發實際功能嗎?如下圖所示,我試着用調度器連接信號,但是這個函數似乎只打印出東西,而不是處理變量,甚至調用其他函數。

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 
+0

我認爲你可以將超過1種功能的信號。這會解決你的問題嗎? –

+0

事實上,你可以將函數鏈接到信號上......我相信我的實際問題是'scrapy'的結構 - 這是通過先創建一個.py文件來運行蜘蛛,然後對它進行排序之後輸出文件。這非常有幫助:http://snipplr.com/view/67012/selfcontained-script-to-crawl-site-updated-scrapy-130dev/ – corg

+1

不應該dispatcher.connect(...)在__init __( )而不是start_requests()? – imwilsonxu

回答

0

我砍了一條管道來解決這個問題給你。

文件: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文件進行了排序! HTH

乾杯

+0

嗯,我沒有注意到,這是從2012年...希望它可以幫助別人大聲笑 – rocktheartsm4l

+0

感謝復活這一個哈哈 - 沒有任何更多的項目,但我相信這會工作 – corg

相關問題