Récupération d'url(s) de résultats de recherches Google

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir, je butes sur un problème depuis pas mal de temps maintenant. J’aimerais récupérer sur la page de recherche Google les trois premières url(s). Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests 
import bs4

URL = "https://www.google.fr/search?q=pablo+picaso&oq=pablo+picaso"

with requests.get(URL) as webpage:

    parse = bs4.BeautifulSoup(webpage.content, "lxml")

    for h3 in parse.find_all("h3", attrs = {"class":"r"}):
        print(h3.find('a'))

`

Bémol, voici le résultat :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<a href="/url?q=https://fr.wikipedia.org/wiki/Pablo_Picasso&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFggWMAA&amp;usg=AOvVaw3C4Ae4bl97kEpmF6pbj6bo"><b>Pablo Picasso</b> — Wikipédia</a>
<a href="/url?q=https://fr.vikidia.org/wiki/Pablo_Picasso&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFgghMAE&amp;usg=AOvVaw3kB15d0KlUAsGsmFKWRLeu"><b>Pablo Picasso</b> - Vikidia, l'encyclopédie des 8-13 ans</a>
<a href="/url?q=https://www.picasso.fr/&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFggrMAI&amp;usg=AOvVaw3ipUVckFU2futqWq_n0NEW">Accueil | <b>Picasso</b></a>
<a href="/url?q=http://mediation.centrepompidou.fr/education/ressources/ENS-PICASSO/ENS-picasso.html&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFggwMAM&amp;usg=AOvVaw3s5eSejCeb9l0wX9ZqwxeK">Dossier pédagogique : <b>Pablo Picasso</b> - Centre Pompidou</a>
<a href="/url?q=http://www.grandspeintres.com/picasso/biographie.php&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFgg2MAQ&amp;usg=AOvVaw1PQjXNVyJFdQvGtwgS5OxC"><b>Pablo Picasso</b> - Biographie de <b>Pablo Picasso</b> - Les Grands Peintres</a>
<a href="/url?q=http://www.moreeuw.com/histoire-art/biographie-pablo-picasso.htm&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFgg8MAU&amp;usg=AOvVaw3zi8YhYUSt1P3A1e-_Iil6"><b>Pablo Picasso</b> peintre- Biographie <b>Pablo Picasso</b>, expositions</a>
<a href="/url?q=http://www.linternaute.com/biographie/pablo-picasso/&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFghCMAY&amp;usg=AOvVaw3yfaT5ohBbgX1EB05vFu71">Biographie <b>Pablo Picasso</b> - L'Internaute</a>
<a href="/url?q=https://www.grandpalais.fr/fr/article/qui-est-pablo-picasso&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFghIMAc&amp;usg=AOvVaw2zdGGXFTbxB882A85Rz9ii">Qui est <b>Pablo Picasso</b> ? | RMN - Grand Palais jeune public, Picasso ...</a>
<a href="/url?q=https://www.grandpalais.fr/fr/carte-didentite-3&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFghOMAg&amp;usg=AOvVaw17T0zcGZLk3z3K0I8t1OwS"><b>Pablo Picasso</b> - Grand Palais</a>
<a href="/url?q=https://www.histoire-pour-tous.fr/biographies/3199-pablo-picasso-1881-1973-biographie-courte.html&amp;sa=U&amp;ved=0ahUKEwjYp_nhkKPbAhXCDcAKHTEqAg0QFghTMAk&amp;usg=AOvVaw3vpTm4zH2WBxfgtknw5kkQ"><b>Pablo Picasso</b> (1881-1973) - Biographie courte - Histoire pour Tous</a>

Et donc j’aimerais juste récupérer les trois url en questions et pas le gros bloc de code html J’ai testé pas mal de possibilités, rien trouvé Merci pour votre aide.

PS: J’ai tenté h3.find().href et Python retourne None

+0 -0

Cette réponse a aidé l’auteur du sujet

Coucou, Je connais pas Beautifull Soup.

Mais j’ai fais :

1
        print(type(h3.find('a')))
1
<class 'bs4.element.Tag'>

Dans la doc QuickStart

Du coup je suppose que ça devrait être à peu près ce que tu cherches :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
import bs4

URL = "https://www.google.fr/search?q=pablo+picaso&oq=pablo+picaso"

with requests.get(URL) as webpage:

    parse = bs4.BeautifulSoup(webpage.content, "lxml")

    for h3 in parse.find_all("h3", attrs = {"class":"r"})[:3]:
        print(h3.find('a').get('href'))

`

Résultat :

1
2
3
4
$ python testZds.py 
/url?q=https://es.wikipedia.org/wiki/Pablo_Picasso&sa=U&ved=0ahUKEwiw9PiKoqPbAhXhYJoKHTFPAZ4QFggWMAA&usg=AOvVaw3vQBPoiVEmuuEVztKmCNBC
/search?q=pablo+picasso&ie=UTF-8&prmd=ivnsb&tbm=isch&tbo=u&source=univ&sa=X&ved=0ahUKEwiw9PiKoqPbAhXhYJoKHTFPAZ4QsAQIIQ
/url?q=https://www.biografiasyvidas.com/biografia/p/picasso.htm&sa=U&ved=0ahUKEwiw9PiKoqPbAhXhYJoKHTFPAZ4QFggxMAg&usg=AOvVaw0j3cidJEjBk0GxTzCGHnBq

Édité par ache

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Re’ ! Alors j’ai trouvé dans le code source html des blocs plus élégants à analyser, j’ai revu mon code mais bs4 n’a pas l’ai de trouver les tags cite dans le code html.

1
2
3
4
5
<!-- Un des nombreux cite dans le code source de https://www.google.com/search?q=pablo+picaso&oq=pablo+picaso -->

<cite class="iUh30">https://fr.wikipedia.org/wiki/Pablo_Picasso</cite>

`
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import requests 
import bs4

URL = "https://www.google.fr/search?q=pablo+picaso&oq=pablo+picaso"
webpage = requests.get(URL)
assert webpage.status_code == 200 

parse = bs4.BeautifulSoup(webpage.content, "lxml")
url = [x.text for x in parse.find_all('cite', attrs = {"class":"iUh30"})]    
print(url)

`

print() me renvoie [None]

+0 -0

Cette réponse a aidé l’auteur du sujet

Personnelement en analysant le code source de la pae que tu donnes, je ne trouve pas de cite avec comme classe "iUh30" qui de toute façon est une classe générée aléatoirement j’ai l’impression.

Ce que je trouve par-contre ce sont des elements cite sans class. Certainement que la classe est ajouté par du JS.

Oh et je tenais à dire que ce type de bot est interdit par Google.

https://policies.google.com/terms?gl=US&hl=en

Édité par ache

ache.one                 🦹         👾                                🦊

+0 -0

Quel API ?

ache

https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=017576662512468239146:omuauf_lfve&q=lectures

Nous donnes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
{
   "kind": "customsearch#result",
   "title": "Lectures",
   "htmlTitle": "\u003cb\u003eLectures\u003c/b\u003e",
   "link": "https://www.cis.upenn.edu/~cis160/current/lectures.html",
   "displayLink": "www.cis.upenn.edu",
   "snippet": "Lectures are held in CHEM102 every Tuesday and Thursday from 1:30-3:00 PM. \nWhile lecture attendance is not mandatory, it is highly recommended that you ...",
   "htmlSnippet": "\u003cb\u003eLectures\u003c/b\u003e are held in CHEM102 every Tuesday and Thursday from 1:30-3:00 PM. \u003cbr\u003e\nWhile \u003cb\u003electure\u003c/b\u003e attendance is not mandatory, it is highly recommended that you&nbsp;...",
   "cacheId": "k9487vOAo70J",
   "formattedUrl": "https://www.cis.upenn.edu/~cis160/current/lectures.html",
   "htmlFormattedUrl": "https://www.cis.upenn.edu/~cis160/current/\u003cb\u003electures\u003c/b\u003e.html",
   "pagemap": {
    "metatags": [
     {
      "viewport": "width=device-width, initial-scale=1.0"
     }
    ]
   },
   "labels": [
    {
     "name": "lectures",
     "displayName": "Lectures",
     "label_with_op": "more:lectures"
    }
   ]
  },
...

Avec plusieurs entrées de ce type.

+0 -0

CustomSearch ne permet pas de chercher sur l’entièreté du Web mais seulement sur un nombre de site restrein (custom).

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Re’. Finalement je compte laisser à plus tard ce petit bout de code, je pense pouvoir récupérer l’url avec des expressions régulières bien qu’il me semble que ce genre de pratique est interdite sur Google je vais peut être me pencher sur duckduckgo.com qui semble plus flexible.

Merci pour votre aide !

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut !

Qu’est-ce que ça donne avec ceci ? Normalement, tu peux accéder à n’importe quel attribut d’un tag HTML de cette façon avec BeautifulSoup.

1
2
3
4
5
6
7
8
9
import requests 
import bs4

URL = "https://www.google.fr/search?q=pablo+picaso&oq=pablo+picaso"

with requests.get(URL) as webpage:
    parse = bs4.BeautifulSoup(webpage.content, "lxml")
    for h3 in parse.find_all("h3", attrs = {"class":"r"}):
        print(h3.find('a')["href"])

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0
Auteur du sujet

Salut ! En effet ça fonctionne, je récupère bien l’URL mais disons "morcellée". Elle se trouve entre /url?q= et &sa=U&ved=0ahUKEwi..... alors que j’aimerais seulement récupérer l’url. Je pense utiliser les expressions régulières pour palier à se problème.

+0 -0

Ah, en effet, c’est Google qui fournit des liens qui font des redirections vers ces URL. Apparemment, le module urllib fournit une fonction pour les parser (voir ici), ça m’a l’air de convenir à ton usage. ;)

Par contre, j’ai l’impression qu’il y a encore quelques transformations à faire sur l’URL pour pouvoir faire une requête avec…

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

C’est une URL Percent-coded pour pouvoir l’utiliser comme valeur dans un query string (la partie après le ? dans l’URL).

|urllib| gère ça très bien. Normalement il te convertit ça en dico et tu récupères la valeur de la clé ’q’ et tu as l’URL directement.

Édité par ache

ache.one                 🦹         👾                                🦊

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte