Как получить данные в другом формате, используя scrapy - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь почистить данные о ноутбуках от Amazon.

Мой код:

class AmazonData(scrapy.Spider):
    name = 'amazon_laptops'
    allowed_domains = ['https://www.amazon.com/']

    # generate link from dataframe
    start_urls = ['https://www.amazon.com' + str(i) for i in df.link.values]

    def parse(self, response):
        for vals in response.xpath("//table[@id='productDetails_techSpec_section_1']"):

            yield {
            'parameters': [x.strip() for x in vals.xpath("//tr/th[@class='a-color-secondary a-size-base prodDetSectionEntry']/text()").getall()],
            'values': [x.strip() for x in vals.xpath("//tr/td[@class='a-size-base']/text()").getall()]
        }

Вывод выглядит так:

[ {'parameters': ['resolution', 'ram', ...], 'values': ['1920x1080', '8gb', ...}]

Это не так читаемый, и после сохранения этого вывода в CSV-файл, нет возможности получить DataFrame для некоторых манипуляций с данными.

Я понятия не имею, как получить DataFrame выглядит следующим образом:

  resolution  ram  ...
0  1920x1080  8gb  ...
1  1366x768   4gb  ...

Примеры URL: Ссылка 1 , Ссылка 2

1 Ответ

2 голосов
/ 04 мая 2020

Поскольку таблицы меняются, это не так просто, но вот один из способов решения этой проблемы:
Вы можете создать пустой фрейм данных со всеми интересующими вас столбцами, а затем очистить параметры и значения из таблицы, объедините их в словарь и затем добавьте эти словарные записи в ваш фрейм данных. Используя for-l oop -logi c, вы учитываете, что некоторые значения могут отсутствовать в вашей таблице, а порядок в таблицах может отличаться.

Этот код основан на двух приведенных вами URL-примерах:

import scrapy
import pandas as pd

class AmazonData(scrapy.Spider):
    name = 'amazon_laptops'
    df = pd.DataFrame(columns=['Screen Size', 'Screen Resolution', 'Max Screen Resolution', 'Processor', 'RAM', 'Hard Drive', 'Graphics Coprocessor', 'Chipset Brand', 'Card Description', 'Graphics Card Ram Size', 'Wireless Type', 'Number of USB 2.0 Ports', 'Number of USB 3.0 Ports'])

    start_urls = ['https://www.amazon.com/dp/B081945D2S', 'https://www.amazon.com/dp/B081721LTM']

    def parse(self, response):
        product = response.url.split("/")[-1]
        summary_table = response.xpath("//table[@id='productDetails_techSpec_section_1']//tr")
        keys = [x.strip() for x in summary_table.xpath(".//th/text()").getall()]
        values = [x.strip() for x in summary_table.xpath(".//td/text()").getall()]
        table_dict = dict(zip(keys, values))

        for key, val in table_dict.items():
            if key in list(self.df):
                self.df.loc[product, key] = val
        print(self.df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...