Pular para o conteúdo principal

Net::Whois - Scraper que verifica dados de domínio via RDAP e WHOIS

Visão geral do scraper

Visão geral do scraper

Os dados sobre o domínio são coletados via RDAP (HTTP, JSON), WHOIS (porta 43) ou página web do operador — dependendo da zona de domínio. Para cada TLD no scraper, são definidos servidores RDAP e WHOIS; se o RDAP estiver disponível para a zona, a consulta é realizada através dele primeiro; em caso de erro, recorre-se ao WHOIS; se nenhum dos dois estiver disponível, a consulta é feita via web, quando a página existe.

O conjunto de métodos de verificação depende do operador, e não apenas do TLD. Algumas zonas não possuem WHOIS ou RDAP, ou eles não funcionam — por decisão do operador. A página web para verificação também não existe para todos: sua disponibilidade também é definida pelo operador. Se a página existir, o scraper solicita os dados através dela.

Existem zonas onde o operador possui apenas o TLD, e os sites são registrados no SLD (segundo nível, por exemplo co.uk, org.uk). O proprietário do SLD pode ser um ou vários — mas não é o operador do TLD. O conjunto de métodos de verificação é definido pelo proprietário do SLD: WHOIS, RDAP, página web, uma combinação deles — ou nada disso.

A composição dos campos no WHOIS e RDAP também pode variar — devido à legislação, política do operador e restrições de dados pessoais. Mas o conjunto em geral é previsível: registro, datas, NS, registrador, status.

Ao coletar via web, não há padronização. Sempre é verificado se o domínio está registrado ou não. O restante depende do que o operador exibiu na página: pode ser um conjunto quase completo ou apenas o fato do registro.

Saiba mais: RDAP (inglês), WHOIS.

A funcionalidade do A-Parser permite salvar as configurações de extração de dados para uso futuro (presetes), definir agendamentos de extração de dados e muito mais. Você pode usar a multiplicação automática de consultas, substituição de subconsultas a partir de arquivos, busca por combinações alfanuméricas e listas para obter o máximo de resultados possível.

A gravação dos resultados é possível no formato e estrutura que você necessita, graças ao poderoso motor de modelos integrado Template Toolkit, que permite aplicar lógica adicional aos resultados e exibir os dados em vários formatos, incluindo JSON, SQL e CSV.

Casos de uso do scraper

Dados coletados

A lista abaixo é um conjunto típico para WHOIS/RDAP; campos específicos dependem da resposta do servidor e das leis. Ao coletar via web, apenas o fato do registro é garantido; outros campos são preenchidos se o operador os publicar.

  • $registered — se o domínio está registrado ou não
  • $expire_date — data de expiração do registro do domínio
  • $creation_date — quando o domínio foi registrado
  • $free_date — data de liberação do domínio
  • $whoisserver — servidor WHOIS utilizado (em consultas WHOIS; frequentemente vazio em RDAP)
  • $rdapserver — URL do servidor RDAP (em consultas RDAP bem-sucedidas)
  • $registrar — registrador do domínio
  • $updated_date — data da última atualização do registro
  • $data — resposta bruta: texto WHOIS ou JSON RDAP
  • Array $ns (Name servers):
    • $ns.$i.server — nome do servidor NS
  • Array $statuses (Statuses list):
    • $statuses.$i.status — status do domínio

Recursos

  • Seleção automática de RDAP ou WHOIS por zona de domínio (prioridade RDAP)
  • Se a zona não possuir WHOIS/RDAP funcional, mas tiver uma página web do operador — a verificação é feita através dela
  • A composição dos campos WHOIS/RDAP depende da resposta do servidor e da legislação
  • Na extração de dados via web, a existência do domínio é sempre verificada; os demais campos apenas se o operador os fornecer
  • Algumas zonas (TLD e SLD) não possuem WHOIS/RDAP nem página web — os dados WHOIS não estão disponíveis, mas a existência do domínio é verificada via Net::DNSNet::DNS
  • Suporte para domínios internacionais (IDN, por exemplo яндекс.рф)

Opções de uso

  • Coleta de domínios livres ou que ficarão livres em breve
  • Coleta de lista de servidores NS
  • Obtenção de status de domínios

Consultas

Como consultas, é necessário indicar o domínio do site desejado, por exemplo:

a-parser.com  
yandex.ru
google.com
vk.com
facebook.com

Opções de exibição de resultados

O A-Parser suporta formatação flexível de resultados graças ao motor de modelos integrado Template Toolkit, o que permite exibir resultados em formato livre, bem como estruturado, como CSV ou JSON

Saída padrão

Formato do resultado:

$query - registered: $registered, expire: $expire_date, creation: $creation_date

O resultado exibe o domínio, se está registrado, a data de expiração e a data de registro do domínio:

facebook.com - registered: 1, expire: 30.03.2028, creation: 29.03.1997
a-parser.com - registered: 1, expire: 25.02.2022, creation: 25.02.2012
vk.com - registered: 1, expire: 23.06.2021, creation: 24.06.1997
yandex.ru - registered: 1, expire: 01.10.2021, creation: 23.09.1997
google.com - registered: 1, expire: 14.09.2028, creation: 15.09.1997

Exibição da lista de NS

Formato do resultado:

$ns.format('$server\n')

Exemplo de resultado:

demi.ns.cloudflare.com
vern.ns.cloudflare.com

Exibição de dados de prazos do domínio em CSV

Formato do resultado:

[% tools.CSVline(query, registered, expire_date, creation_date, updated_date, free_date, whoisserver, rdapserver, registrar) %]

Exemplo de resultado (domínio .com, resposta via RDAP — whoisserver vazio, rdapserver preenchido):

a-parser.com,1,25.02.2027,25.02.2012,10.02.2026,none,,https://rdap.verisign.com/com/v1/domain/a-parser.com,"Squarespace Domains II LLC"

Exibição da lista de NS em tabela CSV

Formato do resultado:

[% FOREACH ns;
tools.CSVline(query, server);
END %]

Exemplo de resultado:

a-parser.com,demi.ns.cloudflare.com
a-parser.com,vern.ns.cloudflare.com

Dump de resultados em JSON

Formato geral do resultado:

[% IF notFirst;
",\n";
ELSE;
notFirst = 1;
END;

obj = {};
obj.query = query;
obj.registered = p1.registered;
obj.expire_date = p1.expire_date;
obj.creation_date = p1.creation_date;
obj.updated_date = p1.updated_date;
obj.free_date = p1.free_date;
obj.whoisserver = p1.whoisserver;
obj.rdapserver = p1.rdapserver;
obj.registrar = p1.registrar;
obj.domains = [];

FOREACH item IN p1.ns;
obj.domains.push({
server = item.server
});
END;

obj.json %]

Texto inicial:

[

Texto final:

]

Exemplo de resultado (RDAP):

[{
"registered": 1,
"rdapserver":"https://rdap.verisign.com/com/v1/domain/a-parser.com",
"query":"a-parser.com",
"free_date":"none",
"domains":[
{
"server":"demi.ns.cloudflare.com"
},
{
"server":"vern.ns.cloudflare.com"
}
],
"registrar":"Squarespace Domains II LLC",
"expire_date":"25.02.2027",
"creation_date":"25.02.2012",
"whoisserver":"",
"updated_date":"10.02.2026"
}]
dica

Para que as opções "Prepend text" e "Append text" estejam disponíveis no Editor de tarefas, é necessário ativar "More options".

Processamento de resultados

O A-Parser permite processar resultados diretamente durante a extração de dados; nesta seção, apresentamos os casos mais populares para o scraper Net::Whois

Obtenção do registrador do domínio

Ao responder via WHOIS, o campo $p1.data contém texto; via RDAP — JSON. Para obter o registrador em ambos os casos, adicione dois Construtores de resultados.

Adicionar Result Builders (Construtor de resultados) e selecionar a fonte na lista suspensa: $p1.data. Selecionar o tipo: RegEx Match. No campo Expressão Regular, inserir: Registrar:\s*(.+) e salvar na variável registrarwhois.

Adicionar novamente um Result Builders (Construtor de resultados) e selecionar a fonte na lista suspensa: $p1.data. Selecionar o tipo: RegEx Match. No campo Expressão Regular, inserir: "entities"[\s\S]+?"vcardArray"[\s\S]+?"fn"[\s\S]+?"text"[\s\S]+?"([^"]+?)" e salvar na variável registrarrdap.

Adicionar ao Result format (Formato do resultado): [% IF registrarrdap == 'none' %]$query - $registrarwhois[% ELSE %]$query - $registrarrdap[% END %] — se o RDAP não encontrar o nome (registrarrdap for igual a none), o valor do WHOIS será exibido, caso contrário, o do RDAP.

Baixar exemplo

Como importar o exemplo para o A-Parser

eJyVVNtO20AQ/RVrFEQoJioPfbGEqkATiSpNKAH1wU6lVTxJt6x3ze46EEX5987Y
jh1TpKpP9lzPmdvuYIPWSaMhugzBC/fk7iw69A6ieAd5+Q8RWFxL562wEEIurKMg
cohhij6Kfvwy0pEhxZUolIdwB36bI4UZym5limSUKckrYzPhKWnpBhuhCnaLT4Lb
cdBg2FTkwdVVcKqNxtPgZNF7LtBug4ug1/i8MCbFjSbz0fsenIUdpl/InmjYLxYh
VNBuXPIg5F5+OaiLbIxzscEHw2ylwlY9JmkqMubbS4VHtg6qgvpnA//KGUSaSk/d
FKpC4Ca1qI9aPnO9K6EchsCUJbqxNRnl9FhmKOs40IuhqgsoR1EGf69imhyOuI4F
MUnfWqRHK7yxs5wJkX4HRg+VmuAGleuQ2F4XUqU00uGKgm7rwPddZn/l2Df1HUPR
4F8scWiylNL17FsblZqJWTd2JTPpSeFuTKGp9o8hPCHmh57B1FB3MmOxQakDa3Ba
2xw1L1k7smHeqjpVdMZypNyBM4VdEl5M+DRlwa2vl5k2C1/L5PyN4P6waVGSuA/9
wfnZwfhQBZDoDU+xu7Ww2If/BZQAak97hS6BmLCSZL44/5zAZilsOrRWbLv6le7K
vFpdTT/+mQD9nSXwT858R0SZ6C2NXsn1rL7pQxML/UDPxkzfmCxXyBPXhVK0sA7v
28sZunpBWWhn9zb4poQgHs1bQnSMcl/nFbfcSmL3iTlntGPHqHXKpVDq8X5ybOFA
500+0yNr3yx2eTIgLqpHbbCkW2wvs6TKRS7p3teGDpEk7kT9BDZP5Y7W+be7q7Qc
Vur2fwBx19yZ

Configurações possíveis

ParâmetroValor padrãoDescrição
Recursive queryPermite obter uma versão estendida do WHOIS
WHOIS serverPermite definir seu próprio servidor WHOIS
RDAP serverPermite definir seu próprio servidor RDAP
Checking by DNSPermite verificar se o domínio está registrado com base na existência de um IP para o domínio
Checking domains by DNS recordVerificação de IP; se encontrar o status ALLOCATED, define o domínio como registrado; se a opção estiver desativada, a verificação de IP não ocorre
Force DNS check for not found domainsVerificação forçada se o domínio foi identificado como não registrado