Создание DataFrame из очищенных данных с использованием Scrapy

У меня проблема с созданием файла данных типа CSV из очищенных данных. Мне удалось очистить данные из таблицы, но когда дело доходит до записи, я не могу сделать это в течение нескольких дней. Я использую предметы и пытаюсь записать их во фрейм данных панд. Я использую список предметов.

import scrapy
from wiki.items import WikiItem
import pandas as pd

class Spider(scrapy.Spider):

name = "wiki"
start_urls = ['https://datatables.net/']

def parse(self, response):

    items = {'Name':[], 'Position':[], 'Office':[], 'Age':[],
        'Start_Date':[],'Salary':[]}

    trs = response.xpath('//table[@id="example"]//tr')
    name = WikiItem()
    pos = WikiItem()
    office = WikiItem()
    age = WikiItem()
    start_data = WikiItem()
    salary = WikiItem()

    name['name'] = trs.xpath('//td[1]//text()').extract()
    pos['position'] = trs.xpath('//td[2]//text()').extract()
    office['office'] = trs.xpath('//td[3]//text()').extract()
    age['age'] = trs.xpath('//td[4]//text()').extract()
    start_data['start_data'] = trs.xpath('//td[5]//text()').extract()
    salary['salary'] = trs.xpath('td[6]//text()').extract()

    items['Name'].append(name)
    items['Position'].append(pos)
    items['Office'].append(office)
    items['Age'].append(age)
    items['Start_Date'].append(start_data)
    items['Salary'].append(salary)

    x = pd.DataFrame(items, columns=['Name','Position','Office','Age',
        'Start_Date','Salary'])

    yield x.to_csv("r",sep=",")

Из этого кода я получаю вот так;

,Name,Position,Office,Age,Start_Date,Salary
0,"{'name': [u'Tiger Nixon',
      u'Garrett Winters',
      u'Ashton Cox',
      u'Cedric Kelly',
      u'Airi Satou',
      u'Brielle Williamson',
      u'Herrod Chandler',

Я получаю столбец с именами, но получаю его 59 раз. Например, у меня есть первая строка "Тигр Никсон" 59 раз. Я получаю столбец положения 59 раз также и так далее. И очищенные данные также не в хорошей форме. Я новичок в области терапии и открыт для любой помощи или предложений. Заранее спасибо!

РЕДАКТИРОВАТЬ: Мои items.py это так;

import scrapy


class WikiItem(scrapy.Item):


name = scrapy.Field()
position = scrapy.Field()
office = scrapy.Field()
age = scrapy.Field()
start_data = scrapy.Field()
salary = scrapy.Field()

2 ответа

Решение

Хорошо, я не могу комментировать и не могу проверить ваш код, потому что у меня нет определения WikiItem. Но давайте повторим этот ответ, хорошо? Можете ли вы проверить, что вы получаете с этим кодом?

class Spider(scrapy.Spider):

    name = "wiki"
    start_urls = ['https://datatables.net/']

    def parse(self, response):

        trs = response.xpath('//table[@id="example"]//tr')

        if trs:
            items = []
            for tr in trs:
                print tr.xpath('td[2]//text()').extract()
                item = {
                    "Name": tr.xpath('td[1]//text()').extract(),
                    "Position": tr.xpath('td[2]//text()').extract(),
                    "Office": tr.xpath('td[3]//text()').extract(),
                    "Age": tr.xpath('td[4]//text()').extract(),
                    "Start_Date": tr.xpath('td[5]//text()').extract(),
                    "Salary": tr.xpath('td[6]//text()').extract()
                }
                items.append(item)


            x = pd.DataFrame(items, columns=['Name','Position','Office','Age',
                'Start_Date','Salary'])

            yield x.to_csv("r",sep=",")

Я знаю, что это не совсем относится к варианту использования, заданному вопросом, но я чувствую, что это имеет отношение к заголовку вопроса: как вернуть объект pd DataFrame в scrapy Spider ?

Контекст:

Если вы пытаетесь экспортировать pd.DataFrameобъект в скрап-пауке, если прямо указать yield df, Например:

      import scrapy 
import json
import pandas as pd 

class Spider(scrapy.Spider): 
   start_urls = ['mywebsite.com'] 

   def parse(self, response):
       #Let us assume mywebsite.com contains a script tag with JSON data rendered serverside
       script = response.xpath('//script[@id="windowData"]/text()').extract_first()
      
       data = json.loads(script)

       #Construct dataframe from dictionary
       df = pd.DataFrame.from_dict(data['anInterestingPieceOfData'])
 
       yield df

Это вернет ошибку о том, что вещь, которую вы пытаетесь получить, не является Request, BaseItem, dict or None, вместо этого это .

Решение

Таким образом, возникает вопрос, как я могу преобразовать DataFrameобъект в какой-то дикт? Это не касается вашего формата экспорта канала (если паук выводит CSV или JSON или что-то еще).

Вы можете использовать что-нибудь из панд to_csv, to_json, но я считаю, что гибкий вариант — использовать to_dict, такие как использование yield fromсинтаксис:

      yield from self.df.to_dict(orient="records")
Другие вопросы по тегам