Catégories
français seo theory & Babbar

Utiliser l’API pour trouver les liens communs de la SERP

Il y a quelque chose que j’aime bien faire quand j’analyse une SERP sur une nouvelle niche, cette chose c’est voir si il existe des dénominateurs communs entre toutes les pages qui « performent » pour la requête.
Ces dénominateurs communs, on pourrait les appeler les « super linkers », c’est-à-dire les sites web qui sont dans les backlinks d’une grande partie des pages qui sont présentes dans la SERP.

Babbar propose les hosts qui pointent vers une URL donnée, on a donc la data qu’il faut pour trouver ces super linkers, mais à la main c’est assez pénible à faire : il faut prendre chaque URL séparément, aller chercher la liste des hosts via l’interface, etc. Avec l’API Babbar qui est disponible depuis peu, rien de plus facile à faire.

Le process que nous allons suivre est très simple : on va chercher les 10 pages positionnées pour une requête donnée, puis on va ensuite appeler l’API Babbar pour trouver les hosts qui pointent vers ces pages, et on va compter combien de fois apparait chaque host.

Le fichier ci-dessus contient le code python pour faire tout le calcul.
Le premier fichier est requirements.txt, il sert à installer les paquets Python nécessaires.

pip3 install -r requirements.txt

Le deuxième fichier get_hosts_backlinks.py est le coeur du sujet du jour.

python3 get_hosts_backlinks.py -h (pour l'aide)

python3 get_hosts_backlinks.py -q 'La query de ton choix' -o Nom_du_fichier_de_sortie.csv (out.csv par défaut)

Que fait ce code ?

API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
API_URL = 'https://www.babbar.tech/api/url/backlinks/host/'

def get_serp_urls(query):
    """La fonction qui renvoie les 10 premières URLs d'une SERP
    Arguments:
    query:(string): La requête à envoyer à Google"""

    res = requests.get("https://www.google.com/search",
                       params = {
                           'gl' : 'FR',
                           'lr' : 'lang_FR',
                           'hl' : 'fr',
                           'safe' : 'off',
                           'nfpr' : 1,
                           'nomo' : 0,
                           'num' : 10,
                           'filter' : 0,
                           'complete' : 0,
                           'gws_rd' : 'ssl',
                           'q' : query
                       })
    if res.status_code == requests.codes.ok:
        soup = BeautifulSoup(res.text, 'lxml')
        divs = soup.body.find_all('div', class_ = 'kCrYT')
        urls = []
        for d in divs:
            if d.a and d.a.previous_element == d:
                urls.append(d.a['href'].split('&')[0][7:])
        if len(urls) < 10:
            nextpage = soup.body.footer.a
            if nextpage and 'aria-label' in nextpage.attrs and nextpage['aria-label'] == "Page suivante":
                u = urljoin("https://www.google.com/", nextpage['href'])
                r = requests.get(u)
                soup = BeautifulSoup(r.text, 'lxml')
                divs = soup.body.find_all('div', class_ = 'kCrYT')
                for d in divs:
                    if d.a and d.a.previous_element == d:
                        urls.append(d.a['href'].split('&')[0][7:])
    return urls[:10]

Tout d’abord une première fonction permet de renvoyer les 10 premières URLs proposées par Google pour une requête query donnée en entrée à la fonction.
le coeur du calcul est la fonction suivante, qui prend en entrée les URLs que va renvoyer la fonction vue plus haut, la requête et le nom d’un fichier de sortie.

def write_hosts_backlinks(urls, out, query):
    """Fonction qui récupère les backlinks et écrit la liste
    dans le fichier de sortie
    Arguments:
    urls:(list): La liste des URLs
    out:(string): Le nom du fichier de sortie
    query:(string): La SERP visée"""

    hosts = {}
    
    for u in urls:
        res = requests.post(API_URL + '?api_token=' + API_KEY,
                            json = {'url' : u})
        if res.status_code == requests.codes.ok:
            for h in res.json()['backlinks']:
                h = h['host']
                if h not in hosts:
                    hosts[h] = 0
                hosts[h] += 1

        time.sleep(10)

    l = sorted(hosts.items(), key = lambda x: x[1], reverse = True)
        
    fout = open(out, 'w')
    writer = csv.writer(fout, quoting = csv.QUOTE_ALL)
    writer.writerow(['HOST', 'NB OCCURENCE(S) DANS LES BACKLINKS DE LA SERP ' + query.upper()])
    for row in l:
        writer.writerow(row)

L’API babbar est très standard, il n’y a donc aucune surprise sur la manière de « l’attaquer » pour obtenir les résultats. Il y a une temporisation de 10 secondes dans le code, c’est pour que le code soit compatible avec le rate le plus bas offert par l’API : 6 appels par minute.
Le reste du code, que je n’affiche pas ici, fait les appels aux deux fonctions ci-dessus pour effectuer réellement le calcul.

Qu’est-ce que ça donne ? testons sur la requête « consultant SEO »…

python3 get_hosts_backlinks.py -q 'consultant seo' -o toto.csv 
Les premiers hosts qui pointent vers des pages de la requête « consultant SEO »

La figure montre les premiers hosts qui sont dans les liens vers les résultats de la requête « consultant SEO ». On voit que le site http://www.reference-menthe.fr/ est le super linker de cette requête, pour la peine je lui mets un authentique backlink, même si j’avoue que je ne m’attendais pas forcément à ce type de site.

Voilà, à vous de jouer maintenant !