2017-10-19 12 views
0

Je suis actuellement en train de construire mon premier projet scrapy. Actuellement, j'essaie d'extraire des données d'un tableau HTML. Voici mon araignée crawl jusqu'à présent:Exportation Csv scrapy a toutes les données extraites dans une cellule

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from digikey.items import DigikeyItem 
from scrapy.selector import Selector 

class DigikeySpider(CrawlSpider): 
name = 'digikey' 
allowed_domains = ['digikey.com'] 
start_urls = ['https://www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1'] 
['www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/4?stock=1'] 

rules = (
    # Extract links matching 'category.php' (but not matching 'subsection.php') 
    # and follow links from them (since no callback means follow=True by default). 
    Rule(LinkExtractor(allow=('/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1',), deny=('subsection\.php',))), 
) 

def parse_item(self, response): 
    item = DigikeyItem() 
    item['partnumber'] = response.xpath('//td[@class="tr-mfgPartNumber"]/a/span[@itemprop="name"]/text()').extract() 
    item['manufacturer'] = response.xpath('///td[6]/span/a/span/text()').extract() 
    item['description'] = response.xpath('//td[@class="tr-description"]/text()').extract() 
    item['quanity'] = response.xpath('//td[@class="tr-qtyAvailable ptable-param"]//text()').extract() 
    item['price'] = response.xpath('//td[@class="tr-unitPrice ptable-param"]/text()').extract() 
    item['minimumquanity'] = response.xpath('//td[@class="tr-minQty ptable-param"]/text()').extract() 
    yield item 

parse_start_url = parse_item 

racle la table www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/4?stock=1. Il exporte ensuite toutes les données dans un fichier digikey.csv mais toutes les données sont dans une cellule. Csv file with scraped data in one cell

setting.py

BOT_NAME = 'digikey' 

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


# Crawl responsibly by identifying yourself (and your website) on the user-agent 
USER_AGENT = 'digikey ("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36")' 

# Obey robots.txt rules 
ROBOTSTXT_OBEY = False 

Je veux l'information gratté avec une ligne à la fois avec les informations correspondantes associées à ce numéro de pièce.

items.py

import scrapy 


class DigikeyItem(scrapy.Item): 
    partnumber = scrapy.Field() 
    manufacturer = scrapy.Field() 
    description = scrapy.Field() 
    quanity= scrapy.Field() 
    minimumquanity = scrapy.Field() 
    price = scrapy.Field() 
    pass 

Toute aide est très appréciée!

Répondre

0

Le problème est que vous chargez dans chaque champ d'un seul élément les colonnes entières. Je pense que ce que vous voulez est quelque chose comme:

for row in response.css('table#productTable tbody tr'): 
    item = DigikeyItem() 
    item['partnumber'] = (row.css('.tr-mfgPartNumber [itemprop="name"]::text').extract_first() or '').strip() 
    item['manufacturer'] = (row.css('[itemprop="manufacture"] [itemprop="name"]::text').extract_first() or '').strip() 
    item['description'] = (row.css('.tr-description::text').extract_first() or '').strip() 
    item['quanity'] = (row.css('.tr-qtyAvailable::text').extract_first() or '').strip() 
    item['price'] = (row.css('.tr-unitPrice::text').extract_first() or '').strip() 
    item['minimumquanity'] = (row.css('.tr-minQty::text').extract_first() or '').strip() 
    yield item 

J'ai un peu changé les sélecteurs pour essayer de le raccourcir. btw s'il vous plaît éviter le manuel extract_first et strip répétitions que j'ai utilisé ici (juste à des fins de test), et envisager d'utiliser Item Loaders, il devrait être plus facile de prendre le premier et dépouiller/formater la sortie désirée.