Encontrando domínios expirados com Python

Aprenda como conseguir domínios expirados com links em qualquer site


Autor: Réulison Silva Publicado em: Agosto 24, 2019

Nesse tutorial eu vou te ensinar como usar um crawler para capturar uma listagem de domínios, classificá-los usando a API da Mozscape (Page Authority e Domain Authority) juntamente com a API do WHOIS para verificar a disponibilidade desses domínios. Eu usei :tw-1f49a: Python!

Se você não sabe nada sobre Python, confira os primeiros passos no Python.

O exemplo que vou usar é, tentar encontrar um ou mais domínios expirados que possuam 1 ou mais links do www.blog.saude.gov.br, o blog do ministério da saúde.

Usando o Jupyter Notebook você insere uma lista de domínios capturados pelo Screaming Frog, classifica-os com o PA / DA na API da Moz e usa a API do WHOIS para determinar a disponibilidade do domínio.

Ahh é tudo gratuito até um limite de 500 consultas. Isso vai diminuir nossas chances de encontrar o domínio, visto que só poderei usar o crawling em 500 URLs.

Altere as variáveis do client para incluir seu Access ID e Secret Key da API Mozscape.

Depois, você precisa instalar o mozcape module, que seja usado na API.

git clone https://github.com/seomoz/SEOmozAPISamples.git
cd SEOmozAPISamples/python
pip install . # or alternatively python setup.py install

Uma outra alternativa, você pode instalar diretamente do GitHub usando a seguinte invocação:

pip install git+https://github.com/seomoz/SEOmozAPISamples.git#egg=mozscape&subdirectory=python

Lembre de deixar os arquivos do Mozscape no mesmo diretório do seu projeto. Agora vamos importar as bibliotecas e módulos necessários.

from mozscape import Mozscape
import pandas as pd
import numpy as np
import requests
import json
import time

def divide_chunks(l, n): 
    for i in range(0, len(l), n):  
        yield l[i:i + n] 
        
client = Mozscape('seu_access_ID', 'sua_secret_key')

A variável csv é extraida do relatório Outlinks do Screaming Frog. Basta você escolher um ou mais domínios, usar a ferramenta e exportar o relatório de Outlinks.

O arquivo precisa estar diretório do seu projeto também.

headers = {'user-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}

for vals in x:
    da_pa = client.urlMetrics(vals, Mozscape.UMCols.domainAuthority | Mozscape.UMCols.pageAuthority)
    i = 0
    for y in da_pa:
        y['url'] = vals[i]
        try:
            r = requests.get(vals[i], headers=headers)
            y['status'] = r.status_code
        except requests.exceptions.ConnectionError:
            y['status'] = -1
        i = i+1
        df = df.append(y, ignore_index=True)
        print(y)    
    time.sleep(5)

headers está configurado para “imitar” o Googlebot para evitar que os servidores bloqueiem as verificações do status HTTP do domínio. Ele espera 5 segundos para cada 5 domínios verificados com a API Moz.

headers = {'user-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}

for vals in x:
    da_pa = client.urlMetrics(vals, Mozscape.UMCols.domainAuthority | Mozscape.UMCols.pageAuthority)
    i = 0
    for y in da_pa:
        y['url'] = vals[i]
        try:
            r = requests.get(vals[i], headers=headers)
            y['status'] = r.status_code
        except requests.exceptions.ConnectionError:
            y['status'] = -1
        i = i+1
        df = df.append(y, ignore_index=True)
        print(y)    
    time.sleep(5)

Resultado:

{'upa': 57, 'pda': 93, 'url': 'http://www.blog.saude.gov.br', 'status': 200}
{'upa': 59, 'pda': 89, 'url': 'http://brasil.gov.br', 'status': 200}
{'upa': 85, 'pda': 95, 'url': 'https://pt-br.facebook.com', 'status': 200}
{'upa': 99, 'pda': 93, 'url': 'https://instagram.com', 'status': 200}
{'upa': 100, 'pda': 93, 'url': 'https://twitter.com', 'status': 200}
{'upa': 100, 'pda': 99, 'url': 'https://www.youtube.com', 'status': 200}
{'upa': 95, 'pda': 92, 'url': 'https://www.flickr.com', 'status': 200}
{'upa': 66, 'pda': 95, 'url': 'http://pt.slideshare.net', 'status': 200}
{'upa': 64, 'pda': 93, 'url': 'http://www.saude.gov.br', 'status': 200}
{'upa': 41, 'pda': 84, 'url': 'https://campusvirtual.fiocruz.br', 'status': 200}
{'upa': 47, 'pda': 93, 'url': 'http://webradio.saude.gov.br', 'status': 200}
{'upa': 56, 'pda': 80, 'url': 'http://www.acessoainformacao.gov.br', 'status': 200}
{'upa': 66, 'pda': 89, 'url': 'http://www.brasil.gov.br', 'status': 200}
{'upa': 45, 'pda': 89, 'url': 'http://barra.brasil.gov.br', 'status': 200}
{'upa': 52, 'pda': 52, 'url': 'http://fonts.googleapis.com', 'status': 404}
{'upa': 66, 'pda': 95, 'url': 'https://pt.slideshare.net', 'status': 200}
{'upa': 41, 'pda': 93, 'url': 'http://portalarquivos2.saude.gov.br', 'status': 200}
{'upa': 42, 'pda': 88, 'url': 'http://gov.br', 'status': 200}
{'upa': 47, 'pda': 84, 'url': 'https://www.fiocruzbrasilia.fiocruz.br', 'status': -1}
{'upa': 42, 'pda': 58, 'url': 'https://www.unasus.gov.br', 'status': 200}
{'upa': 31, 'pda': 21, 'url': 'https://www.educsaite.org', 'status': 200}
{'upa': 66, 'pda': 94, 'url': 'http://www.planalto.gov.br', 'status': 200}
{'upa': 48, 'pda': 68, 'url': 'http://www.governoeletronico.gov.br', 'status': 200}
{'upa': 44, 'pda': 51, 'url': 'http://acessibilidadelegal.com', 'status': 200}
{'upa': 39, 'pda': 44, 'url': 'http://acessodigital.net', 'status': 200}
{'upa': 62, 'pda': 79, 'url': 'https://www.paho.org', 'status': -1}
{'upa': 48, 'pda': 81, 'url': 'http://www2.portoalegre.rs.gov.br', 'status': 200}
{'upa': 30, 'pda': 53, 'url': 'https://ead.unasus.ufcspa.edu.br', 'status': 200}
{'upa': 41, 'pda': 65, 'url': 'https://www.pessoacomdeficiencia.gov.br', 'status': -1}
{'upa': 60, 'pda': 93, 'url': 'http://portalms.saude.gov.br', 'status': 200}
{'upa': 100, 'pda': 93, 'url': 'https://www.instagram.com', 'status': 200}
{'upa': 100, 'pda': 93, 'url': 'http://www.instagram.com', 'status': 200}
{'upa': 26, 'pda': 21, 'url': 'http://www.cantinasaudavel.com.br', 'status': -1}
{'upa': 61, 'pda': 92, 'url': 'http://portal.anvisa.gov.br', 'status': 200}
{'upa': 30, 'pda': 33, 'url': 'http://www.sofiafeldman.org.br', 'status': 200}
{'upa': 40, 'pda': 39, 'url': 'http://www.mansaodocaminho.com.br', 'status': 200}
{'upa': 62, 'pda': 93, 'url': 'http://portalsaude.saude.gov.br', 'status': 200}
{'upa': 48, 'pda': 93, 'url': 'http://www.webradio.saude.gov.br', 'status': 200}
{'upa': 55, 'pda': 82, 'url': 'http://www.aids.gov.br', 'status': 200}
{'upa': 52, 'pda': 93, 'url': 'http://dab.saude.gov.br', 'status': 200}
{'upa': 61, 'pda': 92, 'url': 'http://www.ans.gov.br', 'status': 200}
{'upa': 49, 'pda': 84, 'url': 'http://www.pns.icict.fiocruz.br', 'status': 200}
{'upa': 65, 'pda': 86, 'url': 'http://www.ibge.gov.br', 'status': 200}
{'upa': 42, 'pda': 58, 'url': 'http://www.unasus.gov.br', 'status': 200}
{'upa': 21, 'pda': 34, 'url': 'https://portal.sabertecnologias.com.br', 'status': 200}
{'upa': 47, 'pda': 84, 'url': 'http://www.fiocruzbrasilia.fiocruz.br', 'status': -1}
{'upa': 32, 'pda': 48, 'url': 'https://educadores.senasp.gov.br', 'status': 200}
{'upa': 53, 'pda': 93, 'url': 'http://www.into.saude.gov.br', 'status': 200}
{'upa': 55, 'pda': 93, 'url': 'http://www.conselho.saude.gov.br', 'status': 200}
{'upa': 24, 'pda': 39, 'url': 'http://portalms.saude.gov', 'status': -1}
{'upa': 42, 'pda': 83, 'url': 'http://formsus.datasus.gov.br', 'status': 200}
{'upa': 50, 'pda': 84, 'url': 'http://www.iff.fiocruz.br', 'status': 200}
{'upa': 59, 'pda': 84, 'url': 'http://www.fiocruz.br', 'status': 200}
{'upa': 53, 'pda': 84, 'url': 'http://www.ensp.fiocruz.br', 'status': 200}
{'upa': 50, 'pda': 93, 'url': 'http://provab.saude.gov.br', 'status': -1}
{'upa': 62, 'pda': 79, 'url': 'http://www.paho.org', 'status': -1}
{'upa': 54, 'pda': 89, 'url': 'http://www.justica.gov.br', 'status': 200}
{'upa': 41, 'pda': 55, 'url': 'http://www.unfpa.org.br', 'status': 403}
{'upa': 84, 'pda': 93, 'url': 'https://soundcloud.com', 'status': 200}
{'upa': 50, 'pda': 93, 'url': 'http://www.inc.saude.gov.br', 'status': 200}
{'upa': 89, 'pda': 97, 'url': 'http://maps.google.com', 'status': 200}
{'upa': 21, 'pda': 39, 'url': 'http://combateaedes.saude.gov', 'status': -1}
{'upa': 47, 'pda': 84, 'url': 'http://www.agencia.fiocruz.br', 'status': 200}
{'upa': 50, 'pda': 84, 'url': 'http://www.coc.fiocruz.br', 'status': 200}
{'upa': 60, 'pda': 80, 'url': 'http://www.bndes.gov.br', 'status': 200}
{'upa': 57, 'pda': 93, 'url': 'http://maismedicos.saude.gov.br', 'status': 200}
{'upa': 41, 'pda': 63, 'url': 'http://www.unasus.ufma.br', 'status': 200}
{'upa': 55, 'pda': 93, 'url': 'http://bvsms.saude.gov.br', 'status': 200}
{'upa': 51, 'pda': 91, 'url': 'http://www2.inca.gov.br', 'status': 200}
{'upa': 82, 'pda': 94, 'url': 'https://issuu.com', 'status': 200}

Agora vamos analisar todos os domínios com resposta HTTP >= 400 com a variável status_code_threshold.

status_code_threshold = 400
da_threshold = 25
error_urls = df[(df['status'] >= status_code_threshold) & (df['pda'] >= da_threshold)]['url'].tolist()

Altere a variável whois_api_key igual à chave da API WHOIS XML. 500 consultas disponíveis gratuitamente.

whois_api_key = "seu_api_key"

for x in error_urls:
    dnsapi = "https://www.whoisxmlapi.com/whoisserver/WhoisService?apiKey=" + whois_api_key + "&outputFormat=JSON&cmd=GET_DN_AVAILABILITY&domainName=" + x
    r = requests.get(dnsapi) 
    parsed_json = json.loads(r.text)
    print(parsed_json['DomainInfo']['domainName'] + " status: " + parsed_json['DomainInfo']['domainAvailability'])

Resultado:

googleapis.com status: UNAVAILABLE
unfpa.org.br status: UNAVAILABLE

Como vimos, apenas dois domínios tiveram retorno HTTP igual ou maior 400 e ao consultar a API do WHOIS XML retornou que esses domínios não estão disponíveis.

Consultamos apenas 500 URLs então é comum não encontrar um domínio expirado, eu tentei em outros segmentos e o resultado foi o mesmo. Mas eu também inclui um domínio expirado manualmente em um teste, e funcionou perfeitamente e exibiu AVAILABLE ao lado do domínio.

Quem quiser usar em grande escala para conseguir domínios expirados com bons links basta ter essas ferramentas: Um scrapping como o Screaming Frog, Moz e WHOIS.

Pois somente analisar o DA / PA não é tudo galera, SEO é muito mais que links. E mesmo assim, quando se trata de links, devemos nos atentar também ao contexto.

Se eu planejo comprar domínios expirados para ajudar na minha estratégia de Link Building, eu devo comprar domínios que tenham links que possuem contexto com o domínio que planejo reforçar. Do que adianta comprar um domínio com DA bom, se os links que esse recebe são de um nicho completamente diferente do seu. Nada!

Até mais e não esqueça de deixar seu comentário.