Когда заканчивается scrapy, я хочу создать фрейм данных из всех просканированных данных. - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь почистить некоторые сайты.Я хотел бы сохранить все данные, очищенные в окончательном кадре данных с именем Tabel_Final.Я сохранил каждый атрибут в отдельном списке, а затем я пытаюсь объединить списки в конечном кадре данных, а затем вывести его в виде csv для проверки результатов.У меня есть другой метод в коде, где я добавляю все данные, собранные непосредственно в CSV, но мне очень нужен этот фрейм данных :( Любая помощь, пожалуйста?

Это мой код:

import scrapy
import json
import csv
import re
import pandas as pd


name_list = []
category_list = []
type_list = []
model_list = []
model_name_list = []
model_code_list = []
Tabel_Final = pd.DataFrame(columns=['Country','Category', 'Type', 'Model', 'Name', 'SKU'])

class QuotesSpider(scrapy.Spider):
    name = "quotes1"

    def start_requests(self):
        with open('input.csv','r') as csvf:
            urlreader = csv.reader(csvf, delimiter=',',quotechar='"')
            for url in urlreader:
                if url[0]=="y":
                    yield scrapy.Request(url[1])

    def parse(self, response):

        regex = re.compile(r'"product"\s*:\s*(.+?\})', re.DOTALL)
        regex1 = re.compile(r'"pathIndicator"\s*:\s*(.+?\})', re.DOTALL)
        source_json1 = response.xpath("//script[contains(., 'var digitalData')]/text()").re_first(regex)
        source_json2 = response.xpath("//script[contains(., 'var digitalData')]/text()").re_first(regex1)
        model_code = response.xpath('//script').re_first('modelCode.*?"(.*)"')
        name = response.xpath("//meta[@property='og:country-name']/@content").extract_first()
        source_arr = response.xpath("//script[contains(., 'COUNTRY_SHOP_STATUS')]/text()").extract()
        color = response.xpath("//div[@class='product-details__toggler-info-title']//span[@class='product-details__toggler-selected']/@title").extract()

        if source_json1 and source_json2:
            source_json1 = re.sub(r'//[^\n]+', "", source_json1)
            source_json2 = re.sub(r'//[^\n]+', "", source_json2)
            product = json.loads(source_json1)
            path = json.loads(source_json2)
            product_category = product["pvi_type_name"]
            product_type = product["pvi_subtype_name"]
            product_model = path["depth_5"]
            product_name = product["model_name"]


        if source_json1 and source_json2:
            source1 = source_json1[0]
            source2 = source_json2[0]

            name_list.append(name)
            category_list.append(product_category)
            type_list.append(product_type)
            model_list.append(product_model)
            model_name_list.append(product_name)
            model_code_list.append(model_code)

            with open('output.csv','a',newline='') as csvfile:
                fieldnames = ['Country','Category','Type','Model','Name','SK','Color']
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                if product_category:
                    writer.writerow({'Country': name, 'Category': product_category, 'Type': product_type, 'Model': product_model, 'Name': product_name, 'SK': model_code, 'Color': color})

        if source_arr:
            categorie = re.findall('product.pvi_type_name.*"(.*)"', source_arr[0])
            tip = re.findall('product.pvi_subtype_name.*"(.*)"', source_arr[0])
            model = re.findall('product.displayName.*"(.*)"', source_arr[0])
            model_nume = re.findall('product.model_name.*"(.*)"', source_arr[0])

            name_list.append(name)
            category_list.append(categorie)
            type_list.append(tip)
            model_list.append(model)
            model_name_list.append(model_nume)
            model_code_list.append(model_code)

            with open('output.csv', 'a',newline='') as csvfile:
                fieldnames = ['Country','Category','Type','Model','Name','SK','Color']
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                writer.writerow({'Country': name, 'Category': categorie, 'Type': tip, 'Model': model, 'Name': model_nume, 'SK': model_code, 'Color': color})

        Tabel_Final.append(list(zip(name_list, category_list, type_list, model_list, model_name_list, model_code_list)))
        return Tabel_Final

1 Ответ

0 голосов
/ 29 ноября 2018

Я рекомендую вам разбить вашу кодовую базу:

  1. Проект Scrapy для получения необходимых данных и их экспорта в формат CSV или JSON Lines

  2. Отдельный скрипт, в котором вы загружаете этот вывод в Pandas DataFrame и делаете с ним все, что хотите

В противном случае вы должны научиться как запускать Scrapy из скрипта и соответствующим образом рефакторинг вашего кода.У меня есть любимый проект, который следует этому подходу:

  1. Я определил конвейер Scrapy , который сохраняет все очищенные данные в переменной модуля.

  2. Затем я выполняю паук из моего сценария , как задокументировано , и после завершения очистки я импортирую и читаю переменную модуля , где я сохранил данные.

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