2017-10-01 1 views
9

J'utilise Scrapy pour gratter les images liées à un produit sur amazon.com. Comment est-ce que j'analyserais les données d'image?Gratter les données d'image avec scrapy

J'utilise généralement le XPath. Cependant, je n'ai pas pu localiser le XPath pour les images (en plus des vignettes). Par exemple, voici comment j'analyse le titre.

title = response.xpath('//h1[@id="title"]/span/text()').extract() 

Le lien vers l'article est: https://www.amazon.com/dp/B01N068GIX?psc=1

+0

pouvez-vous ajouter un lien vers la page et spécifier l'élément que vous souhaitez localiser? – CtheSky

+0

J'ai ajouté le lien pour la page. – PiccolMan

Répondre

4

On dirait que les images peuvent être extraites de JavaScript qui est présente dans la source de la page. J'ai utilisé la bibliothèque js2xml pour convertir le code source JavaScript en XML (vous pouvez en apprendre plus sur le blogpost de Scrapinghub). Le XML peut ensuite être utilisé pour créer un Selector avec lequel vous pouvez extraire des données comme d'habitude. Jetez un oeil à cet exemple araignée:

# -*- coding: utf-8 -*-               
import js2xml                 
import scrapy                 

class ExampleSpider(scrapy.Spider):            
    name = 'example'                
    allowed_domains = ['amazon.com']            
    start_urls = ['https://www.amazon.com/dp/B01N068GIX?psc=1/']     

    def parse(self, response):             
     item = dict() 
     js = response.xpath("//script[contains(text(), 'register(\"ImageBlockATF\"')]/text()").extract_first() 
     xml = js2xml.parse(js)             
     selector = scrapy.Selector(root=xml)         
     item['image_urls'] = selector.xpath('//property[@name="colorImages"]//property[@name="hiRes"]/string/text()').extract() 
     yield item 

Si vous souhaitez le tester, l'exécuter comme

scrapy runspider example.py -s USER_AGENT="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36" 

comme Amazon semble bloquer Scrapy basé sur chaîne de l'agent utilisateur.

1

Je sais que la question dit d'utiliser scrapy mais voici une version de ce que vous voulez en utilisant beautifulsoup, demandes, et urllib. Vous évitez également le besoin de définir l'useragent en utilisant cette méthode.

from bs4 import BeautifulSoup as bsoup 
import requests 
from urllib import request 

def load_image(url): 
    resp1 = requests.get(url) 
    imgurl = _find_image_url(resp1.content) 
    resp2 = request.urlopen(imgurl) #treats url as file-like object 
    print(resp2.url) 
def _find_image_url(html_block): 
    soup = bsoup(html_block, "html5lib") 
    body = soup.find("body") 
    imgtag = soup.find("img", {"id":"landingImage"}) 
    imageurl = dict(imgtag.attrs)["src"] 
    return imageurl 


load_image("https://rads.stackoverflow.com/amzn/click/B01N068GIX")