Je cherche à extraire automatiquement des données de cette url:http://www.booking.com/searchresults.fr.html?aid=397596;label=gog235jc-index-fr-XX-XX-unspec-fr-com-L%3Afr-O%3Aunk-B%3Aunk-N%3AXX-S%3Abo;sid=a0171665a7b3d61d70b00ec571b04473;dcid=1;checkin_monthday=16;checkin_year_month=2015-2;checkout_monthday=17;checkout_year_month=2015-2;class_interval=1;csflt=%7B%7D;dest_id=9;dest_type=district;dtdisc=0;hlrd=0;hyb_red=0;inac=0;interval_of_time=undef;nha_red=0;no_rooms=1;redirected_from_city=0;redirected_from_landmark=0;redirected_from_region=0;review_score_group=empty;score_min=0;si=ai%2Cco%2Cci%2Cre%2Cdi;src=index;ss=9e%20arr.%2C%20Paris%2C%20%C3%8Ele-de-France%2C%20France;ss_all=0;ss_raw=paris%209;ssb=empty;sshis=0&;or_radius=0;;nflt=class%3D3%3B;unchecked_filter=class

Je dois relever manuellement les tarifs des hôtels qui se trouvent dans mon arrondissement et cette opération est très chronophage je cherche à automatiser l'extraction des données de cette page. Pour ce faire j'utilise la fonction importxml depuis Google sheets. Via l'outil de développement de chrome je copie le xpath du contenu qui m'intéresse et le colle ensuite dans google sheets en utilisant cette formule =IMPORTXML(url, xpath)


J'ai deux problèmes :
-certaines infos ne remontent pas ( en l’occurrence le prix et le type de chambre) lorsque j'utilise le 1er xpath (cellule B4 de l'impression écran ci dessous) et idem lorsque je cible la zone qui me manque, même résultat ( xpath prix en B5)



- mon second problème : comment faire remonter dans ce tableau les autres pages de résultats

PS: j'ai essayé la solution import.io, mais impossible d'avoir plus d'une page de résultats...


merci par avance de votre aide
upload/57799-booking.png
upload/57799-sheets.png
Modifié par Bene30 (17 Feb 2015 - 11:27)
Merci beaucoup pour l'info.

Néanmoins j'ai l'impression que ça demande pas mal de dev Smiley ohwell

merci encore
Le post est un peu vieux mais bon ........pour utiliser xpath , il faut étudier pour chaque page toutes les options visible ( texte image) ou invisible ( valeurs des id class) et parser en fonction de chaque cas . Le premier item est détecté par la valeur de class ".sr_item" ( csspar ser) .. Si le contenu change selon les pages il faut tester le retour de la valeur de xpath avant d'extraire la valeur . ici la page montre 15 valeurs count(/html/*/*/*/*/*/*/*/*/*/*/div[contains(@class, 'sr_item')]) a parser . pour chaque item on extrait les sous items. regexp peut être mixer avec xpath si le contenu contient des items identiques .

A première vues sans voir le xpath je me demande si celui ci n 'aurait pas des sélecteurs trop spécifique concernant le prix a extraire . il faut tester l expression xpath en manuel sur plusieurs pages .

Il faut que l environnement qui parse soit reconnu comme ayant les fonctionnalités qu'un navigateur web (support http , gestion des cookies , javascript )

Ai déja fait ça en python avec http://4suite.org/ et regexp avec requête dynamique et sauvegarde dans une table mysql . Beaucoups de travail mais maintenant un mix selenium et javascript devrait faire cela ( il doit y avoir un debut de post sur alsa chercher RSS jsonp ) .

upload/48731-alsaxpathh.png

NB
nb pour empécher de parser les données , les sites ne montrent certaines informations qu'après un click de souris sur une zone spécifique (ici le prix !!) après c 'est le jeux du chat et de la souris . En effet , le webmaster du sites consulte le fichier de log du serveur pour identifier des requêtes étrange ( strange user agent name ) . Les données valant de l'or.... peu de sites laisseraient un robot extraire leurs données. Ils amélioraient leur système en utilisant technique http,html/css et javascript ou autres astuces comme modifier la structure des données . Ici booking.com utilise span pour simuler un boutton et le click entraine une requête sur le server pour afficher une nouvelle page qui elle afiche le prix .Le prix s affiche [que si l on clique sur l item prix ( 1ere page ) ] dans la deuxième page . Dans cette 2eme page le prix "apparait" dans une table ( <table>) contenant des champs vide ou se trouveront les données ajouté par javascript .En effet le prix ne s affiche que si la partie prix ( graphique) est visible sur la page . Une fois visible ; si le prix disparait du au scroll de la souris alors le prix reste visible dans le code source . Le script aurait pu inverser les choses et le faire disparaitre à nouveau le prix en dehors de la zone de visibilité du navigateur ( mix selecteur dynamique et css) . Il semble que l apparition n'es tqu un effet visuel car la valeur recherché est dans le code source html au bon emplacement.L'information aurait pu être absente et ajouté dynamiquement par code javascript lors du scroll . Sur cette page on retrouve bien la table de votre capture . Sur le prix qui s affiche il y a aussi un menu associé . Le prix se trouve dans <span class="strike-it-red_anim">
<span id="b_tt_holder_2" class="toggle_price_per_night_or_stay anim_rack_rate_rr read-easy rackrate mouse_hover_general_rackrate mouse_hover_rackrate jq_tooltip" style="cursor:help;" "="" rel="400" data-toponly="1" data-title=" texte">€ 185</span>


".rackrate" en css est le prix barré
".anim_rack_rate" en css est le prix que vous recherché
un fichier css dynamique contient .anim_rack_rate b { visibility: hidden;} qui
visible par .animated .anim_rack_rate b { visibility: visible;} . Il y a donc ajout d un selecteur de nom animated ( voir capture) . Il me semble que le prix est déja présent dans le code html mais que le code html est généré dynamiquement coté client . certains code javascript utlisent des variables a 1/2 caractères ( obfuscator ?)

sinon l info du prix ( plusieurs items ) semble se trouver dans le code source javascript au niveau de
<script id="booking-script-maps-google" type="text/javascript"> booking.loadCurrentHotels = function() { }
chaque item vaut
hotels.push({ "gc": false,
"b_id" : 51765,
"b_main_photo" : 'http://q-ec.bstatic.com/images/hotel/square60/561/561477.jpg',
"b_description" : "Situé à seulement 5 minutes à pied de l\&#39;opéra Garnier et de la Madeleine, le Saint-Pétersbourg Opéra vous propose des chambres climatisées et une réception ouverte 24h&#47;24. ",
"b_name" : "Saint-Petersbourg Opera",
"b_latitude" : 48.87215141747105,
"b_longitude" : 2.3281198740005493,
"b_class" : 3,
"b_class_is_estimated": "0",
"b_url" : "/hotel/fr/saintpetersbourg.fr.html?aid=397596;label=gog235jc-index-fr-XX- XX-unspec-fr-com-L%3Afr-O%3Aunk-B%3Aunk-N%3AXX-S%3Abo;
sid=a0171665a7b3d61d70b00ec571b04473;
dcid=4;
checkin=2015-03-16;checkout=2015-03-17;ucfs=1;
srfid=8798c463699c7ba6aaf49d5b3a11b2d241d64559X1" ,
"prices" : [ { "room_price" : "&#x20AC;&nbsp;180", "room_persons" : "2" } , { "room_price" : "&#x20AC;&nbsp;189", "room_persons" : "2" } , { "room_price" : "&#x20AC;&nbsp;231", "room_persons" : "3" } , { "room_price" : "&#x20AC;&nbsp;245", "room_persons" : "2" } , { "room_price" : "&#x20AC;&nbsp;258", "room_persons" : "2" } ] ,
"b_has_genius_rates" : !!(parseInt('0',10)) });

nombre chargé / visible est .sr_item/ .animated. mais lesv aleurs semble présetne dans larbre html mais seulement pas visible.

NB changer regulièrement
a) d IP ( vpn ?)
b) de http-header ( mappping proxy ?
sinon j ai utiliser la syntaxe de selection css dans mes réponses a convertir en expression de sélection xpath si vous allez dans cette voie ......

Voila un début d 'idée ... rien n'est facile ....mais on apprend beaucoups .....
Modifié par 75lionel (07 Mar 2015 - 10:21)
un peu plus dinfo :
l appartion du prix demande que javascript soit actif pour charger une nouvelle page /searchresults.fr.html?aid= .......

le fichier json semble changer de contenu dynamiquement coté client après chargement entre b_url et b_has_genius_rates

"b_url": "/hotel/fr/saintpetersbourg.fr.html?aid=397596;label=gog235jc-index-fr-XX-XX-unspec-fr-com-L%3Afr-O%3Aunk-B%3Aunk-N%3AXX-S%3Abo;sid=a0171665a7b3d61d70b00ec571b04473;dcid=4;ucfs=1;srfid=3eac5d009a8ea15144a6e4dcfbbeb59dada3fb17X1",

"b_min_rate": "&#x20AC;&nbsp;152.00",

"b_has_genius_rates": !!(parseInt('0', 10))

LE site semble une implementation du type de jquery mobile avec beaucoups de code /structure html créer dynamiquement sur le client .

L'extraction doit se faire coté client dans le navigateur pour laisser les scripts s executer / se générer ( script cookies ou autres : visuel , interne , manipulation de data de structure html .....) .
Cdt
upload/48731-alsa-book-.png
Modifié par 75lionel (07 Mar 2015 - 10:05)
Les service REST est un service PAYANT et tout ca est bien logique et dans ce cas ne demande pas beaucoups de travail si le fichiers de données est directement accessible ( sax dom parser ) . Google aussi propose de nombreux services rest gratuit jusqu'a une certaine limite ( genre google map ) . En dessous c'est gratuit , si le seuil est atteint et plus de crédit ( crédit gratuit consommé) => le service est bloqué ( remise a zéro tous les jours selon la politique de google ) .
upload/48731-als-bookin.png
Modifié par 75lionel (07 Mar 2015 - 10:13)
75lionel a écrit :

L'extraction doit se faire coté client dans le navigateur pour laisser les scripts s executer / se générer ( script cookies ou autres : visuel , interne , manipulation de data de structure html .....) .


cURL est un client comme un autre. Si le site peut extrapoler un résultat à partir de ce qu'il reçoit du serveur, tu peux le faire aussi.