CSV-файл Scrapy имеет неверный формат - PullRequest
1 голос
/ 09 июля 2020

Обычно я помещаю извлеченные мной данные в файл csv, но есть некоторые проблемы с форматом.

-Сначала отображаются только части, больше ничего не отображается fg. Количество и цена - Во-вторых, заголовки столбцов, кажется, повторяются в нижних строках.

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

    name = 'digi'
    allowed_domains = ['digikey.com']
    custom_settings = {
        "USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"


    }
    start_urls = ['https://www.digikey.com/products/en/integrated-circuits-ics/memory/774?FV=-1%7C428%2C-8%7C774%2C7%7C1&quantity=0&ColumnSort=0&page=1&k=cy621&pageSize=500&pkeyword=cy621']

    def parse(self, response):
        data={}
        parts=response.css('Table#productTable.productTable')
        for part in parts:
            for p in part.css('tbody#lnkPart'):
                yield {
                    'Part': p.css('td.tr-mfgPartNumber span::text').extract(),
                    'Quantity': p.css('td.tr-minQty.ptable-param span.desktop::text').extract(),
                    'Price': p.css('td.tr-unitPrice.ptable-param span::text').extract()
                }

НАСТРОЙКИ

BOT_NAME = 'website1'

SPIDER_MODULES = ['website1.spiders']
NEWSPIDER_MODULE = 'website1.spiders'

#Export as CSV Feed
#FEED_EXPORT_FIELDS: ["parts", "quantity", "price"]
FEED_FORMAT = "csv"
FEED_URI = "parts.csv"

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'website1 (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

1 Ответ

1 голос
/ 09 июля 2020

Получаете ли вы правильные данные при тестировании в оболочке Scrapy? Стоит опробовать ваши селекторы в оболочке scrapy, прежде чем передавать их в скрипт.

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

Обновление:

Поскольку вы спросили о for l oop

for p in response.css('tbody#lnkPart > tr'):
        
       yield {
                'Part': p.css('td.tr-mfgPartNumber span::text').get(),
                'Quantity': p.css('td.tr-minQty.ptable-param span.desktop::text').get(),
                'Price': p.css('td.tr-unitPrice.ptable-param span::text').get()
       }

Обратите внимание, что нам нужно только l oop вокруг tr, чтобы выбрать все из них. Метод get () выбирает только элемент с указанным c tr.

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

Обновленный код

def parse(self, response):

    for p in response.css('tbody#lnkPart > tr'):
    
        if p.css('td.tr-minQty.ptable-param span.desktop::text').get(): 
            quantity = p.css('td.tr-minQty.ptable-param span.desktop::text').get()
            quantity = quantity.strip()
            cleaned_quantity = int(quantity.replace(',',''))
        else:
            quantity = 'No quantity'
     
        if p.css('td.tr-unitPrice.ptable-param span::text').get():
            price = p.css('td.tr-unitPrice.ptable-param span::text').get()
            cleaned_price = price.strip()
        else: 
            price = 'No Price'
        yield {
                'Part': p.css('td.tr-mfgPartNumber span::text').get(),
                'Quantity': cleaned_quantity,
                'Price': cleaned_price
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...