2016-08-20 5 views
1

Ich versuche, eine CSV-Datei für jede gecrackte URL aus einer Liste von URLs in scrapy zu generieren. Ich verstehe, dass ich pipeline.py modifizieren werde, aber alle meine Versuche sind bisher gescheitert. Ich verstehe nicht, wie ich die URL übergeben kann, die in die Pipeline geschabt wird, und verwende dies als Namen für die Ausgabe und teile die Ausgabe entsprechend auf.So teilen Sie die Ausgabe aus einer Liste von URLs in scrapy

Irgendwelche Hilfe?

Dank

Hier ist die Spinne und die Pipeline

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 

Pipeline:

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 

Antwort

0

Ich denke, Sie sollten all diese Dinge im Batch als Nachbearbeitungsschritt, wenn tun Sie Ihre Crawl endet anstelle von pro-Artikel, aber hier ist ein Entwurf, wie Sie tun könnten, was Sie wollen:

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

Dank @neverlastn. Ich habe deine Lösung versucht, aber sie gibt mir Fehler. Ich glaube, Du hast recht. Ich sollte die Daten nach dem Crawlen nachbearbeiten. Besonders nachdem ich herausgefunden habe, dass Daten pro Zeile nicht in einer Reihenfolge exportiert werden. Jede Zeile der Scraped-Tabelle scheint nicht ordnungsgemäß gecrawlt zu sein, aber einige Zeilen aus anderen Adressen werden exportiert, nachdem der Crawler die andere URL gecrawlt hat. Also im Grunde sieht meine Tabelle wie row1url1, row1url2, row2url1, row2url1 ... – gcc

Verwandte Themen