Хранение сломанных данных в CSV - PullRequest
0 голосов
/ 26 октября 2018

Я изучаю утилизацию, используя скрап. С удовольствием с ним. Единственная проблема в том, что я не могу сохранить скопированные данные так, как я хочу.

Приведенный ниже код очищает отзывы от Amazon. Как сделать хранение данных лучше?

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
import csv

class Oneplus6Spider(scrapy.Spider):
    name = 'oneplus6'
    allowed_domains = ['amazon.in']
    start_urls = ['https://www.amazon.in/OnePlus-Silk-White-128GB- 
    Storage/product-reviews/B078BNQ2ZS/ref=cm_cr_arp_d_viewopt_sr? 
    ie=UTF8&reviewerType=all_reviews&filterByStar=positive&pageNumber=1']

    def parse(self, response):

        writer = csv.writer(open('jack.csv','w+'))

        opinions = response.xpath('//*[@class="a-size-base a-link-normal 
        review-title a-color-base a-text-bold"]/text()').extract()

        for opinion in opinions:
            yield({'Opinion':opinion})

        reviewers = response.xpath('//*[@class="a-size-base a-link-normal 
        author"]/text()').extract()

        for reviewer in reviewers:
            yield({'Reviewer':reviewer})


         verified = response.xpath('//*[@class="a-size-mini a-color-state a- 
         text-bold"]/text()').extract()

         for verified_buyer in verified:
             yield({'Verified_buyer':verified_buyer})

          ratings = response.xpath('//span[@class="a-icon- 
          alt"]/text()').extract()

          for rating in ratings:
              yield({'Rating':rating[0]})


           model_bought = response.xpath('//a[@class="a-size-mini a-link- 
           normal a-color-secondary"]/text()').extract()

          for model in model_bought:
              yield({'Model':model})

Я пытался использовать метод scrapy по умолчанию -o , а также пытался использовать csv.

Данные хранятся в одной строке. Я очень плохо знаком с модулями pandas и csv, и я не могу понять, как хранить удаленные данные в правильном формате?

Хранит все значения в одной строке.

Я хочу разные значения в разных строках

Например: Отзывы | Рейтинг | Модель |

но я просто не могу понять, как это сделать

Как я могу это сделать?

1 Ответ

0 голосов
/ 26 октября 2018

В вашем коде наблюдается, что вы пытаетесь извлечь записи разных типов: все они dict объекты с одним ключом, где ключ может иметь разные значения ("Мнение", "Рецензент" и т. Д.)..).

В Scrapy экспорт данных в CSV выполняется с помощью CsvItemExporter, где метод _write_headers_and_set_fields_to_export - это то, что имеет значение для вашей текущей проблемы, так какэкспортер должен знать список полей (имен столбцов) перед написанием первого элемента.

В частности:

  1. Сначала он проверит атрибут fields_to_export (настраивается с помощью FEED_EXPORT_FIELDS настройка через экспортер каналов ( соответствующий код здесь ))
  2. Если не установлено:
    • 2.a.Если первый элемент - dict, он будет использовать все свои ключи в качестве имени столбца.
    • 2.b.Если первый элемент - scrapy.Item, он будет использовать ключи из определения элемента.

Таким образом, существует несколько способов решения проблемы:

  1. Вы можете определить класс scrapy.Item со всеми возможными ключами, которые вам нужны, и выдавать элементы этого типа в своем коде (просто заполните одно нужное поле и оставьте другие пустыми для любой конкретной записи).
  2. Или правильно настройте параметр FEED_EXPORT_FIELDS и оставьте другую часть существующего кода без изменений.

Полагаю, приведенных выше советов достаточно.Пожалуйста, дайте мне знать, если вам нужны дополнительные примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...