Почему мой скребок записывает только некоторые данные неправильно в файл CSV? - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок во всем этом.Мне удалось пролистать 3600+ элементов на странице и извлечь такие данные, как имя, адрес, телефон, почта.Все, что я написал в файл .csv.

Мое волнение было прервано, когда я обнаружил, что у некоторых дистрибьюторов отсутствовала информация (информация, которая написана на веб-сайте и была неправильно записана в .csv. Кроме того, некоторые пустые столбцы (например, 'B')).

Кроме того, я не смог найти способ, чтобы квадратные скобки и апострофы не были записаны, но я легко могу стереть их все с помощью LibreOficce Calc.

(Вмой код Я вставил только несколько URL из 3600+, в том числе те, что на прилагаемой картинке, которые показывают проблему)

import scrapy
import requests
import csv



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

    def start_requests(self):
        urls = [
'https://www.bosch-professional.com/ar/es/dl/localizador-de-distribuidores/localizador-de-distribuidores/distribuidor/boschla01586 /zarate/bodelon-edgardo-aristides/?countrySelectorCode=AR', 'https://www.bosch-professional.com/ar/es/dl/localizador-de-distribuidores/localizador-de-distribuidores/distribuidor/boschla01778/zarate/cesario- mariano-rodrigo/?countrySelectorCode=AR', 'https://www.bosch- professional.com/ar/es/dl/localizador-de-distribuidores/localizador-de-distribuidores/distribuidor/boschla00140/zarate/de-vicenzi-elio-mario-g.-rosana-sh/?countrySelectorCode=AR', 'https://www.bosch-professional.com/ar/es/dl/localizador-de-distribuidores/localizador-de-distribuidores/distribuidor/boschla01941/zarate/de-vincenzi-elio-mario-y-rosana-sh/?countrySelectorCode=AR', 'https://www.bosch-professional.com/ar/es/dl/localizador-de-distribuidores/localizador-de-distribuidores/distribuidor/boschla02168/zarate/ferreterias-indufer-s.a./?countrySelectorCode=AR',
]


for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)


def parse(self, response):

    marca = []
    names = []
    direcc = []
    locali = []
    telef = []
    mail = []
    site = []


    for item in response.css('div.item-content'):            
        marca.append('Bosch')
        names.append(item.css('p.item-name::text').extract())

        lista_direcc = item.css('p.item-address::text').extract()
        direcc.append(lista_direcc[0].strip())
        locali.append(lista_direcc[1].strip())

        telef.append(item.css('a.btn-phone.trackingElement.trackingTeaser::text').extract())
        mail.append(item.css('a.btn-email.trackingElement.trackingTeaser::text').extract())
        site.append(item.css('a.btn-website.trackingElement.trackingTeaser::text').extract())





    with open('base.csv', 'a') as csvFile:
        fieldnames = ['Empresa', 'Nombres', 'Dirección' , 'Localidad', 'Teléfono', 'Mail', 'Sitio Web']

        writer = csv.DictWriter(csvFile, fieldnames=fieldnames)
        writer.writerow({'Empresa' : marca, 'Nombres' : names, 'Dirección' : direcc, 'Localidad' : locali, 'Teléfono' : telef, 'Mail' : mail, 'Sitio Web' : site })

    csvFile.close()

Here you can see part of the problem

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

Я предполагаю, что решение этой проблемы довольно простое, как и все мои предыдущие вопросы.Но все же это озадачивает меня.

Так что большое спасибо за любую помощь и за терпение моего плохого английского. Приветствия!

1 Ответ

0 голосов
/ 14 февраля 2019

Во-первых, лучше использовать встроенный экспортер фидов CSV вместо собственного метода записи CSV.Другими словами, yield элемент вместо этого и пусть Scrapy обрабатывает CSV.

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

Еще один момент - вам не нужно реализовывать start_request().Вы можете просто указать свои URL-адреса в свойстве start_urls.


Вот пример:

import scrapy

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

    start_urls = [
        # ...
    ]

    def parse(self, response):
        for item in response.css('div.item-content'):
            lista_direcc = item.css('p.item-address::text').getall()

            yield {
                'Empresa': 'Bosch',
                'Nombres': item.css('p.item-name::text').get(),
                'Dirección': lista_direcc[0].strip(),
                'Localidad': lista_direcc[1].strip(),
                'Teléfono': item.css('a.btn-phone.trackingElement.trackingTeaser::text').get(),
                'Mail': item.css('a.btn-email.trackingElement.trackingTeaser::text').get(),
                'Sitio Web': item.css('a.btn-website.trackingElement.trackingTeaser::text').get(),
            }

Как упомянуто @Gallaecio в комментариях ниже, лучшеиспользуйте get() вместо extract(), когда вы ожидаете один элемент (и это предпочтительное использование в настоящее время).Подробнее здесь: https://docs.scrapy.org/en/latest/topics/selectors.html#extract-and-extract-first

Чтобы получить CSV, вы можете запустить:

scrapy runspider spidername.py -o output.csv

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