Récupération d'une url du résultat sur BING

Hello,

j'ai un soucis pour récupérer la première url de résultat sur BING suite à une réquète sur une liste de reférences

ex: j'ai cette référence dans mon Google Sheet : R3704849

je crée la requète dans BING avec cette formule: =CONCATENATE("lien bing";LOWER(SUBSTITUTE(Q13;" ";"+"));"+")

J'obtiens:

lienbing=r3704849+ donc jusqu'a la c'est bon => CF PJ

Je récupère cette valeur ci dessus avec cette formule =IMPORTXML(R13;"//li[@class='b_algo']//div[@class='b_title']//h2//a/@href")

Résultat: le contenu importé est vide

Une idée ?

Merci bcp

?

17bing.txt (606.00 Octets)

Bonjour,

c'est assez curieux en effet car ceci

=IMPORTXML("https://www.bing.com/search?q=R3704849";"//ol[@id='b_results']")

répond ...

"There are no results for R3704849Check your spelling or try different keywordsRef A: 23A82EE388934F25B93D443719CDCD38 Ref B: ATAEDGE0918 Ref C: 
2021-01-21T14:35:15Z"

alors que le code source (et l'inspection) donne bien ceci

<ol id="b_results">
<li class="b_algo">
<h2>
<a href="https://inmobillium.fr/property/R3704849_sale_appartement-mi-etage-benalmadena-pueblo/" h="ID=SERP,5135.1">Property - Costa del Sol Property | Realestate Malaga ...</a>
</h2>

est-ce que éventuellement bling fait une double interrogation et retourne le résultat de la seconde page dans le navigateur ?

Même avec //a/@href cela ne donne pas les liens utiles de la page. J'ai importé le code-source d'une autre façon et idem, je vois bien pourtant un bout de code qui correspond.

<div id="b_content"><main aria-label="Résultats de la recherche"><div id="b_tween"><br><span class="ftrB"></span></div><ol id="b_results"><li class="b_algo"><h2><a href="https://inmobillium.fr/property/R3704849_sale_appartement-mi-etage-benalmadena-pueblo/" h="ID=SERP,5134.1">Property - Costa del Sol Property | Realestate Malaga ...</a></h2><div class="b_caption"><div class="b_attribution" u="0|5075|4959579283130451|aNtGDpGsSDzPW0M3Ck-zzQA8dslT7v5g"><cite>https://inmobillium.fr/property/<strong>R3704849</strong>_sale_appartement-mi-etage...</cite><span class="c_tlbxTrg"><span class="c_tlbxH" h="BASE:CACHEDPAGEDEFAULT" k="SERP,5135.1"></span></span></div>
<p>Belle résidence sécurisée avec piscine à Benalmadena Pueblo. L’appartement béneficie d’une grande terrase de 31m2 avec arrosage automatique bénéficiant d’une petite vue sur la mer. Ce bien immobilier est exposé au sud/Est avec une surface intérieure de 60m2. Il est vendu meublé tel que présenté sur les photos. Son Prix de vente inclu également une place de parking en sous ..</p></div></li></ol></main></div>

Bonjour

c'est peut-être "bing" ?????

Bing peut très bien refuser d'afficher les résultats de la recherche si c'est effectué à partir d'un site/support non autorisé (ce qui n'est pas réellement surprenant sinon ils se feraient spammer par les bots et applications de scraping).

Cela semble être en effet lié à google/bing

Google has lately been blocking search requests made from both Apps Scripts and Google Sheets though the requests are made from one of their own IPs. They probably do this to prevent scraping. There are occasions where it works and you are able to scrape Google search, however, it's time limited so results will vanish after a few minutes/hours. You can try to scrape Bing, DuckDuckGo or other search engines.

j'essaie de passer par qwant, mais cela donne des URL de redirection

=importXML("https://www.qwant.com/?q=R3704849";"//a/@href")

en plus cela a fonctionné une fois, et maintenant il me dit "loading ..."

Sébastien a certainement raison sur le pourquoi ... (même si avec excel cela fonctionne, enfin fonctionnait ... à re-vérifier)

On sort du cadre google sheets, mais j'ai voulu poursuivre avec excel

avec

    page.body.innerHTML = .responseText
' et
    For Each lien In page.getElementsByTagName("a")
        url = lien.getAttribute("HREF")
'...

le néant complet !

1er essai avec bing et split

Sub liste()
Dim txt As String, tbl, i%
    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        .Open "GET", "https://www.bing.com/search?q=R3704849", False
        .send
        txt = .responseText
    End With
    tbl = Split(txt, "href=""")
    For i = 1 To UBound(tbl)
        Debug.Print Split(tbl(i), """")(0)
    Next
End Sub

donne des liens mais rien à voir avec le sujet de recherche

2ème essai avec qwant et split

Option Explicit

Sub liste()
Dim txt As String, tbl, i%
    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        .Open "GET", "https://www.qwant.com/?q=R3704849&t=web", False
        .send
        txt = .responseText
    End With
    tbl = Split(txt, "href=""")
    For i = 1 To UBound(tbl)
        Debug.Print Split(tbl(i), """")(0)
    Next
End Sub

même sanction

il me reste une solution mais cela devient très complexe !

Bing ... bingo ! j'ai obtenu 6 urls.

Je vous envoie en mp à tous les 3 car je ne veux pas publier la méthode utilisée bien qu'elle soit tout à fait "légale" à mon sens, mais alambiquée.

Dans le principe, cela devrait être possible avec Sheets ... peut-être.

Du reste il existe aussi des outils https://serpapi.com/bing-search-api

On sort du cadre google sheets, mais j'ai voulu poursuivre avec excel

Pour Google Sheets, tu peux t'inspirer du code de la fonction HTML_BODY pour récupérer le contenu de la page HTML et pouvoir ensuite extraire les données (j'ai testé avec ton lien QWANT, il y a bien des URLs).

Voila une version personnalisée de ma fonction HTML_BODY :

function HTML_BODY(url) {

  // Source : https://www.sheets-pratique.com/fr/codes/fonction-html-body

  // Requête
  const requete = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});

  // Code de réponse
  const code = requete.getResponseCode().toString();

  // Renvoie le contenu de la page (ou un message d'erreur)
  return code[0] == 2 ? requete.getContentText().match(/(?<=<p class="url">\s*)([^< ]+)/g) || 'Erreur : pas de résultat' : 'Erreur ' + code;
}

Par exemple :

=HTML_BODY("https://www.qwant.com/?q=R3704849&t=web")

Renvoie :

sheets urls

On sort du cadre google sheets, mais j'ai voulu poursuivre avec excel

Pour Google Sheets, tu peux t'inspirer du code de la fonction HTML_BODY pour récupérer le contenu de la page HTML et pouvoir ensuite extraire les données (j'ai testé avec ton lien QWANT, il y a bien des URLs).

Génial, j'étais en train de me documenter justement sur les windows.get() ou autres manières de capturer le contenu d'un écran dans la boite de dialogue html !

Super, je suis bluffé (par ton niveau, mais je n'en doutais pas).

et du coup, maintenant qu'on a eu accès grâce à ta fonction au code source version interro via google sheets, on peut écrire

=importxml("https://www.qwant.com/?q=R3704849&t=web";"//p[@class='url']")

qui fonctionne ... mais pas toujours !! et pas avec bing

Il faudrait envoyer view-source:https://www.bing.com/search?q=R3704849 dans un onglet de chrome ou dans le sidebar et pouvoir récupérer le texte. Sinon la solution de Sébastien fonctionne à merveille avec qwant.

Super Investigation !!

Un grand merci pour votre aide

Sébastien,

Voila une version personnalisée de ma fonction HTML_BODY :

/(?<=<p class="url">\s*)([^< ]+)/g

que signifie ?<= dans cette expression ? est-ce indispensable ?

Dans mon expression, on peut commencer par enlever une paire de parenthèses (pour simplifier légèrement) :

(?<=<p class="url">\s*)[^< ]+

Si on retire (?<= ...

<p class="url">\s*[^< ]+

... ça va retourner ici <p class="url">  en plus de l'URL :

sheets p url

En ajoutant une "assertion arrière positive" ...

(?<=<p class="url">\s*)

... ça indique que [^< ]+ doit être précédé par <p class="url">  mais sans retourner ces informations dans le résultat

Pour plus de détails sur les assertions (c'est pour PHP mais ça semble fonctionner de la même manière en JS) :
https://www.php.net/manual/fr/regexp.reference.assertions.php

En fait c'est le <= qui m'intrigue ... sinon j'ai compris le principe de ne pas afficher le résultat.

(?<= c'est une assertion arrière (<) positive (=).

Bonsoir Sébastien, merci pour cette solution très pratique! Je cherche à récupérer la ligne de description accompagnant les URL, idéalement en ayant un tableau URL + description pour chaque résultat...pouvez-vous m'aider à aller plus loin dans la customisation de la formule HTML_body présentée? Merci bcp!

Bonjour,

function HTML_BODY(url) {

  // Source : https://www.sheets-pratique.com/fr/codes/fonction-html-body

  // Requête
  const requete = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});

  // Code de réponse
  const code = requete.getResponseCode().toString();

  // Renvoie le contenu de la page (ou un message d'erreur)
  return code[0] == 2 ? requete.getContentText().match(/(?<=<p class="url">\s*)[^< ]+\s*<\/p>\s*<p class="desc">[^<]+/g).map(r => r.split(/\s*<\/p>\s*<p class="desc">/)) || 'Erreur : pas de résultat' : 'Erreur ' + code;
}
sheets url descr

C'est fantastique, merci!!! J'ai juste une question, parfois l'erreur TypeError: Cannot read property 'map' of null (ligne 12) s'affiche lors d'une mise à jour alors que la valeur existe, et avait été récupérée, savez vous à quoi cela est dû?

Rechercher des sujets similaires à "recuperation url resultat bing"