2017-09-24 1 views
1

J'apprends le scrapy et je joue avec sa coque pour le moment. Comme un exercice simple, je voudrais extraire les images de la salle visible de ce site: https://www.gumtree.com/flats-houses/london. Après avoir tiré la coquille:Les outils scrapy et chrome ne renvoient pas les mêmes valeurs

scrapy shell "https://www.gumtree.com/flats-houses/london" 

J'utilise la simple commande suivante qui est censé faire le travail:

response.xpath("//div[@class='listing-side']/div[@class='listing-thumbnail']/img/@src").extract() 

Mais cependant, il retourne une liste d'éléments 30, 25 valeurs dont sont des chaînes vides. J'ai d'abord pensé qu'il devait y avoir quelque chose qui n'allait pas avec mon xpath donc je l'ai testé avec des outils de chrome et je dois dire que ça fonctionne comme un charme renvoyant une liste complète d'URL d'image. Tout comme prévu. Mais pourquoi scrapy ne fait pas la même chose alors?

EDIT:

Oh désolé, en fait dans le cas de ce site, pour commencer une coquille doit émettre la commande suivante:

shell -s USER_AGENT="Mozila/5.0" "https://www.gumtree.com/flats-houses/london" 

En d'autres termes, l'agent utilisateur doit être spécifié.

Répondre

1

Essayez de le faire de cette façon:

listings = response.xpath("//div[@class='listing-thumbnail']") 
images = [listing.xpath('.//img/@src').extract()[1] for listing in listings] 

'images' est une liste avec toutes les images annonces.

+0

Il semble fonctionner, mais je ne comprends pas pourquoi mon approche ne fonctionne pas. Même si après avoir joué pendant un certain temps, j'ai compris que si je change l'attribut "src" en "data-lazy", il commence à fonctionner comme prévu. Et ce qu'il faut noter ici, c'est que les deux méthodes fonctionnent aussi bien avec les outils au chrome. Avez-vous des idées sur la façon d'expliquer ce comportement? – Albert

+2

@Albert, avant de faire un grattoir, vous devez vous assurer que vous désactivez javascript et ensuite trouver la logique pour gratter. Sinon, vous serez confus entre le navigateur et le comportement scrapy. –

+0

@TarunLalwani Ah trop raison! Pour une raison quelconque, je n'y ai pas pensé, mon mal. Mais maintenant tout est clair. Je vous remercie! – Albert

1

Pas moyen. Il y a une solution pour vous. La façon dont vous vous attendiez. Essayez ceci:

for item in response.xpath("//img[@itemprop='image'][not(@aria-hidden)]/@src").extract(): 
    print(item) 

Et l'aide du sélecteur css:

for item in response.css("[itemprop='image']:not([aria-hidden])::attr(src)").extract(): 
    print(item) 
+0

Merci beaucoup! – Albert