2017-01-22 5 views
0

Je suis nouveau à python et scrapy, mais je tente de développer un robot et un grattoir pour extraire la liste des produits sur une page amazon,Scrapy sortie Excel Crawler

l'info raclé doit avoir le nom, le prix et le premier disponibilité . Les éléments sont éraflés mais chaque élément éraflé est lorsqu'il est sorti dans un fichier csv est entièrement dans une seule cellule.

enter image description here

Tout ce que je veux est de faire de chaque produit et ses détails correspondants sont dans chaque cellule délivrés distinctement.

La logique est:

items= [] 
    for products in response.xpath('//*[@id="mainResults"]/ul'): 
     item = amazonlist() 

     item['Title'] = products.css('a>h2::text').extract() 
     item['Price'] = products.css(' div > div > div > a > span.a-size-base.a-color-price.s-price.a-text-bold::text').extract() 
     item['Prime'] = products.css(' div > div > div > i::attr(aria-label)').extract() 

     items.append(item) 
    return items 

Pouvez-vous me guider avec cela?

Répondre

0

Je joue avec un peu de web récemment mis au rebut. La façon dont j'ai tiré des choses d'une page Web a été en utilisant lxml pour obtenir le code HTML, puis je stocke cela dans un fichier texte, puis trier à partir de là.

J'espère avoir aidé.

+1

Mais cela nécessiterait encore une intervention humaine, tout ce que je veux, c'est de sortir directement le contenu organisé en feuille Excel. –

0

Depuis que je ne peux pas exécuter votre exemple et avoir seulement une partie de votre code, deux idées. Les deux peuvent ou peuvent ne pas provoquer vos données agglomérées dans une cellule:

  1. Vous retournez tous les éléments à la fois, plutôt que de céder un par un (regarder Python générateurs si vous n'êtes pas sûr Qu'est-ce que cela signifie). Essayez ceci:

    items= [] 
    for products in response.xpath('//*[@id="mainResults"]/ul'): 
        item = amazonlist() 
    
        item['Title'] = products.css('a>h2::text').extract() 
        item['Price'] = products.css(' div > div > div > a > span.a-size-base.a-color-price.s-price.a-text-bold::text').extract() 
        item['Prime'] = products.css(' div > div > div > i::attr(aria-label)').extract() 
    
        yield item 
    
  2. La méthode extract retourne une liste de résultats, un pour chaque match. Si chaque instance products de la boucle contient plusieurs produits, ils correspondent tous. Vous devez interrompre la requête plus bas pour parcourir chaque produit individuel. Vous pouvez utiliser pdb ou une instruction print pour vérifier si, par exemple, item['Title'] contient une liste de chaînes plutôt qu'une.

Espérons que cela aide!

+0

J'ai même essayé ce code, j'ai toujours la même sortie. –

+0

Pourriez-vous poster le reste du code et/ou le site spécifique que vous essayez d'écarter? – primateer