2016-08-20 9 views
1

私はscraped URLのリストからscraped urlごとにcsvファイルを生成しようとしています。私はpipeline.pyを変更することを理解していますが、私の試みは今まで失敗しています。どのように私はパイプラインに掻き取られているURLを渡すことができ、出力の名前としてこれを使用し、それに応じて出力を分割するのか分かりません。治療のURLリストから出力を分割する方法

助けが必要ですか?ここで

おかげ

クモやパイプライン

from scrapy import Spider 
from scrapy.selector import Selector 
from vApp.items import fItem 


class VappSpider(Spider): 

    name = "vApp" 
    allowed_domains = ["google.co.uk"] 
    start_urls = [l.strip() for l in open('data/listOfUrls.txt').readlines()] 


def parse(self, response): 

    trs = Selector(response).xpath('//[@id="incdiv"]/table/tbody/tr') 
    for tr in trs: 
     item = fItem() 

     try: 
      item['item'] = tr.xpath('td/text()').extract()[0] 
     except IndexError: 
      item['item'] = 'null' 

     yield item 

パイプライン:

from scrapy import signals 
from scrapy.contrib.exporter import CsvItemExporter 

class VappPipeline(object): 
    def __init__(self): 
     self.files = {} 

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

    def spider_opened(self, spider): 
     file = open('results/%s.csv' % spider.name, 'w+b') 
     self.files[spider] = file 
     self.exporter = CsvItemExporter(file) 
     self.exporter.fields_to_export = ['item'] 
     self.exporter.start_exporting() 

    def spider_closed(self, spider): 
     self.exporter.finish_exporting() 
     file = self.files.pop(spider) 
     file.close() 

    def process_item(self, item, spider): 
     self.exporter.export_item(item) 
     return item 

答えて

0

私はときに、あなたは後処理ステップとして、バッチ内のすべてのそれらの事をやるべきだと思いますアイテムごとではなくクロールを終了しますが、希望することができる方法に関する草案があります:

from scrapy import Spider 
from scrapy.selector import Selector 
from vApp.items import fItem 


class VappSpider(Spider): 

    name = "vApp" 
    allowed_domains = ["google.co.uk"] 
    start_urls = [l.strip() for l in open('data/listOfUrls.txt').readlines()] 


def parse(self, response): 

    trs = Selector(response).xpath('//[@id="incdiv"]/table/tbody/tr') 
    for tr in trs: 
     item = fItem() 

     try: 
      item['item'] = tr.xpath('td/text()').extract()[0] 
     except IndexError: 
      item['item'] = 'null' 
     item['url'] = response.url 
     yield item 


from scrapy import signals 
from scrapy.contrib.exporter import CsvItemExporter 
from urlparse import urlparse 

class VappPipeline(object): 
    def __init__(self): 
     self.files = {} 
     self.exporter = {} 

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

    def process_item(self, item, spider): 
     url = item['url'] 
     parsed_uri = urlparse(url) 
     domain = parsed_uri.netloc 
     if domain not in self.exporter: 
      file = open('results/%s.csv' % domain, 'w+b') 
      self.files[domain] = file 
      self.exporter[domain] = CsvItemExporter(file) 
      self.exporter[domain].fields_to_export = ['item'] 
      self.exporter[domain].start_exporting() 

     assert domain in self.exporter 

     self.exporter[domain].export_item(item) 

     return item 

    def spider_closed(self, spider): 
     for domain, exporter in self.exporter.iteritems(): 
      exporter.finish_exporting() 
      self.files[domain].close() 
+0

ありがとう@neverlastn。私はあなたのソリューションを試しましたが、私にエラーを失ってしまっています。私はあなたが正しいと思います。クロール後にデータを後処理する必要があります。特に、行ごとのデータがオーダー方法ではなくエクスポートされていることが分かった後に。スクレイプされたテーブルの各行は整然と掻かれていないようですが、クローラが別のURLをクロールした後で、他のアドレスからの行がエクスポートされます。だから基本的に私のテーブルは、row1url1、row1url2、row2url1、row2url1のように見える... – gcc

関連する問題