Конвейер для экспорта csv-файла в нужном формате

Я сделал улучшение в соответствии с предложением из alexce ниже. Мне нужно, как на картинке ниже. Однако каждая строка / строка должна быть одним обзором: с датой, рейтингом, текстом обзора и ссылкой.

Мне нужно, чтобы обработчик товаров обрабатывал каждый просмотр каждой страницы.
В настоящее время TakeFirst () выполняет только первый обзор страницы. Так что 10 страниц, у меня всего 10 строк / строк, как на рисунке ниже.

  • Должен ли я создавать конвейер для сохранения файлов с помощью scrapy?
  • введите описание изображения здесь

    Код паука ниже:

    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 

  • Как написать список в файл csv?
  • написать запятую в CSV-файле, используя python
  • Как я могу разбивать большой файл csv на небольшие файлы на основе общих записей с помощью python
  • Обучение TensorFlow для предсказания столбца в файле csv
  • CSVWriter не сохраняет данные в файл - ПОЧЕМУ?
  • Загрузка файлов Python по ссылкам, хранящимся в csv
  • 2 Solutions collect form web for “Конвейер для экспорта csv-файла в нужном формате”

    Я начал с нуля, и следующий паук должен запускаться с

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

    так что открытие CSV-файла с электронной таблицей показывает для меня

    введите описание изображения здесь

    Надеюсь это поможет 🙂

     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 

    Если использование -t csv (как было предложено Frank в комментариях) по какой-то причине не работает, вы всегда можете использовать встроенный CsvItemExporter непосредственно в настраиваемом конвейере , например:

     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 

    которые необходимо добавить в ITEM_PIPELINES :

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

    Кроме того, я бы использовал Item Loader с процессорами ввода и вывода, чтобы присоединиться к тексту обзора и заменить новые строки пробелами. Создайте класс ItemLoader :

     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() 

    Затем используйте его для создания Item :

     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() 
    Python - лучший язык программирования в мире.