Scrapy Pipeline zum Export von CSV-Datei im richtigen Format

Ich habe die Verbesserung nach dem Vorschlag von alexce unten gemacht. Was ich brauche, ist wie das Bild unten. Jedoch jede Zeile / Zeile sollte eine Bewertung sein: mit Datum, Bewertung, Überprüfung Text und Link.

Ich muss Artikel-Prozessor verarbeiten jede Überprüfung jeder Seite.
Derzeit TakeFirst () nimmt nur die erste Überprüfung der Seite. Also 10 Seiten habe ich nur 10 Zeilen / Zeilen wie im Bild unten.

Bildbeschreibung hier eingeben

Spinnencode ist unten:

import scrapy from amazon.items import AmazonItem class AmazonSpider(scrapy.Spider): name = "amazon" allowed_domains = ['amazon.co.uk'] start_urls = [ 'http://www.amazon.co.uk/product-reviews/B0042EU3A2/'.format(page) for page in xrange(1,114) ] def parse(self, response): for sel in response.xpath('//*[@id="productReviews"]//tr/td[1]'): item = AmazonItem() item['rating'] = sel.xpath('div/div[2]/span[1]/span/@title').extract() item['date'] = sel.xpath('div/div[2]/span[2]/nobr/text()').extract() item['review'] = sel.xpath('div/div[6]/text()').extract() item['link'] = sel.xpath('div/div[7]/div[2]/div/div[1]/span[3]/a/@href').extract() yield item 

2 Solutions collect form web for “Scrapy Pipeline zum Export von CSV-Datei im richtigen Format”

Ich begann von vorne und die folgende Spinne sollte mit laufen

scrapy crawl amazon -t csv -o Amazon.csv --loglevel=INFO

So dass die Eröffnung der CSV-Datei mit einer Tabellenkalkulation für mich zeigt

Bildbeschreibung hier eingeben

Hoffe das hilft 🙂

 import scrapy class AmazonItem(scrapy.Item): rating = scrapy.Field() date = scrapy.Field() review = scrapy.Field() link = scrapy.Field() class AmazonSpider(scrapy.Spider): name = "amazon" allowed_domains = ['amazon.co.uk'] start_urls = ['http://www.amazon.co.uk/product-reviews/B0042EU3A2/' ] def parse(self, response): for sel in response.xpath('//table[@id="productReviews"]//tr/td/div'): item = AmazonItem() item['rating'] = sel.xpath('./div/span/span/span/text()').extract() item['date'] = sel.xpath('./div/span/nobr/text()').extract() item['review'] = sel.xpath('./div[@class="reviewText"]/text()').extract() item['link'] = sel.xpath('.//a[contains(.,"Permalink")]/@href').extract() yield item xpath_Next_Page = './/table[@id="productReviews"]/following::*//span[@class="paging"]/a[contains(.,"Next")]/@href' if response.xpath(xpath_Next_Page): url_Next_Page = response.xpath(xpath_Next_Page).extract()[0] request = scrapy.Request(url_Next_Page, callback=self.parse) yield request 

Wenn Sie mit -t csv (wie von Frank in Kommentaren vorgeschlagen) nicht für Sie aus irgendeinem Grund arbeiten, können Sie immer eingebaute CsvItemExporter direkt in der benutzerdefinierten Pipeline verwenden , zB:

 from scrapy import signals from scrapy.contrib.exporter import CsvItemExporter class AmazonPipeline(object): @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): self.file = open('output.csv', 'w+b') self.exporter = CsvItemExporter(self.file) self.exporter.start_exporting() def spider_closed(self, spider): self.exporter.finish_exporting() self.file.close() def process_item(self, item, spider): self.exporter.export_item(item) return item 

Die Sie zu ITEM_PIPELINES hinzufügen ITEM_PIPELINES :

 ITEM_PIPELINES = { 'amazon.pipelines.AmazonPipeline': 300 } 

Außerdem würde ich einen Item Loader mit Input- und Output-Prozessoren verwenden, um dem Review-Text beizutreten und neue Zeilen mit Leerzeichen zu ersetzen. Erstellen Sie eine ItemLoader Klasse:

 from scrapy.contrib.loader import ItemLoader from scrapy.contrib.loader.processor import TakeFirst, Join, MapCompose class AmazonItemLoader(ItemLoader): default_output_processor = TakeFirst() review_in = MapCompose(lambda x: x.replace("\n", " ")) review_out = Join() 

Dann benutze es, um ein Item zu konstruieren:

 def parse(self, response): for sel in response.xpath('//*[@id="productReviews"]//tr/td[1]'): loader = AmazonItemLoader(item=AmazonItem(), selector=sel) loader.add_xpath('rating', './/div/div[2]/span[1]/span/@title') loader.add_xpath('date', './/div/div[2]/span[2]/nobr/text()') loader.add_xpath('review', './/div/div[6]/text()') loader.add_xpath('link', './/div/div[7]/div[2]/div/div[1]/span[3]/a/@href') yield loader.load_item() 
  • Rekursive Verwendung von Scrapy, um Webseiten von einer Website zu schaben
  • Port Web Scraper, scrapy 0.24, zu Python 3. oder Schrott scrapy für etwas Besseres
  • AttributeError: 'module' Objekt hat kein Attribut 'Spider'
  • Verwirrt über das Ausführen von Scrapy aus einem Python-Skript
  • Fehler beim Crawlen von Element der spezifischen Website mit krassiger Spinne
  • Python und schrott Das kodierungsproblem
  • Modifizieren von CSV-Export in scrapy
  • Links mit Platz vor und nachher werden nicht korrekt analysiert
  • Selen mit Schrammen für dynamische Seite
  • Wie bekomme ich den ganzen Text von einer Website mit Scrapy?
  • Scrapy - Reaktor nicht wiederherstellbar
  • Python ist die beste Programmiersprache der Welt.