2017-07-11 22 views
0

私は、ページ上に複数のリンクを介してクロールし、対応する各リンクからのデータのリストをつかむために以下のコードを使用しています:Scrapy - 重複を削除し、単一のリストとしてデータを出力しますか?

import scrapy 

class testSpider(scrapy.Spider): 
    name = "quotes" 
    start_urls = ['http://www.website.com'] 

    def parse(self, response): 
     urls = response.css('div.subject_wrapper > a::attr(href)').extract() 
     for url in urls: 
      url = response.urljoin(url) 
      yield scrapy.Request(url=url, callback=self.getData) 

    def getData(self, response): 
     data = {'data': response.css('strong.data::text').extract()} 
     yield data 

それは、各リンクのためのデータのリストを返すだとして、それが正常に動作しますが、、

"dalegribel,Chad,Ninoovcov,dalegribel,Gotenks,sillydog22" 

"kaylachic,jmargerum,kaylachic" 

"Kempodancer,doctordbrew,Gotenks,dalegribel" 

"Gotenks,dalegribel,jmargerum" 

... 

(同じデータが複数のページに表示されます)任意の重複することなく、行の単一のリストなどのデータを出力する任意の単純/効率的な方法があり、類似した:CSVへのI出力は、それは次のようなとき、次のように?

dalegribel 
Chad 
Ninoovcov 
Gotenks 
... 

私はその後、出力を得るために、各要素をループ配列を使用してみましたが、収量のみサポート「要求、BaseItem、辞書またはNone」を言ってエラーを取得しています。また、私は約10kのエントリ以上これを実行するように、私は配列にデータを格納する場合は、あまりにも多くの擦り減りを遅くするかどうかはわかりません。ありがとう。

答えて

1

わからない、それは何とかScrapyはビルトインメソッドを使用して行うことができますが、Pythonの方法は、ユニークな要素の集合を作成重複をチェックし、yeildだけのユニークな要素になります場合:

class testSpider(scrapy.Spider): 
    name = "quotes" 
    start_urls = ['http://www.website.com'] 
    unique_data = set() 

    def parse(self, response): 
     urls = response.css('div.subject_wrapper > a::attr(href)').extract() 
     for url in urls: 
      url = response.urljoin(url) 
      yield scrapy.Request(url=url, callback=self.getData) 

    def getData(self, response): 
     data_list = response.css('strong.data::text').extract() 
     for elem in data_list: 
      if elem and (elem not in self.unique_data): 
       self.unique_data.add(elem) 
       yield {'data': elem} 
+0

感謝リスト属性が 'split'をサポートしていないというエラーが出ました。この関数を削除した後、ループが分割を処理しているように見えました。しかし、まだ起こっていると思われることの1つは、CSVにエクスポートするときの各行の間のギャップです(上記のコードの2番目のブロックで示したものと同じです)。空の行がないようにこれを修正する方法はありますか?ありがとうございました。 –

+0

@ExamOrphデータはどのようにCSVに出力されますか?機能によって、または何ですか? – pythad

+0

コマンドライン関数: 'scrapy crawl quotes -o test.csv -t csv' –