Instale o zBot (para Windows). Rode este sistema no seu computador e vários outros que podem ser baixados diretamente pelo zBot ou criados por você mesmo(a)!
                            29/11/2023 | Build: 84
Do pacote: Extrator de contatos                        
Descrição: Faz a busca de um ou mais termos no buscador Google. Em seguida entra em cada link listado no resultado, fazendo a coleta de e-mails ou telefones contidos nas páginas encontradas.

&CriarBotao("Configuração";"configurar") //*
&CriarBotao("Obter emails";"extrair emails") //*
&CriarBotao("Obter telefones";"extrair telefones") //*
&TbDefinirCamposVisiveis("data_cadastro,email,nome,telefone")[0]
#configurar
    &ValorPedirVarios("Configurações"; "termo de busca,ignorar se tiver")[0] //*
#
#extrair emails
// definie variáveis de controle para o extrator de dados saber se é para extrair emails ou telefones
[modo extracao] = "email"
&BlocoExec("processar extração")[0] //*
#
#extrair telefones
// definie variáveis de controle para o extrator de dados saber se é para extrair emails ou telefones
[modo extracao] = "telefone"
&BlocoExec("processar extração")[0] //*
#
// Faz a busca para um termo de busca
#processar extração
    &TextoQtdLinhas([termo de busca]; "qtd termos")[0] //*      
    [inseridos] = 0
    &TextoObterDataHora("hoje")[0] //*
    &TextoDataInfo([hoje]; "secao_data"; "hoje")[0] //* valor -#-/ ano, mês, dia, hora, minuto, segundo, dia_semana, secao_data, secao_hora
    &TextoGerarIdUnico("id único")[0] //*
        
    &Progresso2Iniciar("Termos";[qtd termos])[0] //*    
    &Repetir([qtd termos])
       [links] = ""
       // Primeiro faz a busca       
       [termo atual] = [termo de busca*[_indice]]
       &Progresso2Inc(1)[0] //*       
       &StatusInserir("Efetuando busca: [termo atual]";"importante")[0] //* cor: erro, sucesso, alerta, preto, cinza, importante
       &BlocoExec("efetuar busca")[0] //* os dados vão para "conteúdo"       
       &StatusInserirExtra("OK";"sucesso")[0] //* cor: erro, sucesso, alerta, preto, cinza, importante
       
       // Aproveita e extrai e-mails na própria página de busca
       &StatusInserir("Obtendo e-mails da página de resultado...";"preto")[0] //* cor: erro, sucesso, alerta, preto, cinza, importante
       [link atual] = "Resultado da busca: [termo de busca]"       
       [dados] = [conteúdo]              
       &BlocoExec("extrair dados")[0] //* os dados vão para "links"               
       // Pega os links contidos no resultado
       &StatusInserir("Obtendo links da busca...";"preto")[0]
       &BlocoExec("extrair links")[0] //* os dados vão para "links"            
       &TextoQtdLinhas([links]; "qtd")[0] //*
       &StatusInserirExtra("Total: [qtd]";"preto")[0]    
       
       // Agora entra em cada link para procurar emails dentro
       &StatusInserir("Extraindo contatos dos links...";"preto")[0]
       &Progresso1Iniciar("Progresso";[qtd])[0] //*
       &Repetir([qtd]) //* a variável _indice terá o número do ciclo atual
         &Progresso1Inc(1)[0] //*    
         [link atual] = [links*[_indice]]
         &TextoTemValorLista([link atual];[ignorar se tiver];"localizou")[0] //* Retorna sim | não
         &Se([localizou];diferente;"sim")
            &TextoTem([links visitados];[link atual];"retorno")[0] //* Retorna sim | não
            &Se([retorno];diferente;"sim")
               &StatusInserir("Link: [link atual] ";"cinza")[0]
               &URLBaixar([link atual];"dados") //*
               &TextoEntre([dados];"#-\title#-/";"#-\/title#-/";"título atual")[0] //* 
               &ValorInserirLinha("links visitados";[link atual])[0] //*     
               &BlocoExec("extrair dados")[0] //* os dados vão para "links"
            .senao
              &StatusInserir("Link já visitado: [link atual] ";"alerta")[0]                            
            .fimse   
         .senao
            &StatusInserir("Link ignorado: [link atual] ";"erro")[0]         
         .fimse   
       .fimrepetir
           
    .fimrepetir   
    &StatusInserir("Fim do processamento";"importante")[0]
    &StatusInserir("Total de e-mails inseridos: [inseridos]";"preto")[0]       
#
// - - - - - - - - - - -
// Efetua uma busca e coloca os dados na variável "conteúdo"
#efetuar busca
    [conteúdo] = "" 
    [link de busca] = "https://www.google.com.br/search?num=100&site=&source=hp&q=[termo atual]"    
    &URLBaixar([link de busca];"conteúdo") //*
    &TextoTem([conteúdo];"unusual traffic from";"resultado")[0] //* Retorna sim | não
    &Se([resultado];=;"sim")
      &NavegadorIr([link de busca])[5] //*
      &NavegadorPosicionar(5;5;700;500)[0] //* topo, esquerda, largura, altura            
      &NavegadorFonteObter("conteúdo")[2] //*    
    .fimSe    
#
// Extrai links da variável "conteúdo" e coloca em "links"
#extrair links    
    &TextoExtrairContendo([conteúdo]; "www"; "dados"; "")[0] //*    
    &Marcador("loop")
    &TextoQtdLinhas([dados]; "qtd")[0] //*
    &Repetir([qtd])
      [link final] = [dados*[_indice]]         
      &TextoSubstituir([link final]; "//"; ""; "link final")[0] //*
      &TextoSubstituir([link final]; "&"; "&"; "link final")[0] //*
      [link final] = "https://[link final]"     
      
      &TextoRemoverFim([link final]; "&"; "link final")[0] //*
      &TextoTem([link final];"google.";"resultado")[0] //* Retorna sim | não      
      &Se([resultado];igual;"não")
         //&TbInserir("email";[link final])[0] //*
          &ValorInserirLinha("links";[link final])[0] //*          
      .fimse    
    .fimrepetir
#
// Extrai emails da variável "dados" e insere na tabela os que não existirem
#extrair dados    
    &Se([modo extracao];igual;"email")
      &TextoExtrairEmails([dados]; "dados")[0] //*
    .senao         
      &TextoExtrairTelefones([dados]; "dados")[0] //*    
    .fimse
        
    &TextoQtdLinhas([dados]; "qtd")[0] //*
    &Repetir([qtd])
      [info] = [dados*[_indice]]
      &Se([info];diferente;"") 
         &TextoTemValorLista([info];[ignorar se tiver];"localizou")[0] //* Retorna sim | não
         &Se([localizou];diferente;"sim")  
            &TbLocalizar([modo extracao];[info]; "localizou")[0] //*         
            &Se([localizou*[modo extracao]];diferente;[info])          
               &TbInserir("[modo extracao],site,obs,descricao,data_cadastro,id_unico";"[info],[link atual],[termo atual],[título atual],[hoje],[id único]")[0] //*
               &ValorInc("inseridos";1)[0] //*
               &StatusInserir("Inserido: [info] (total: [inseridos])";"sucesso")[0]
            .senao
               &StatusInserir("Já tem no banco: [info]";"erro")[0]   
            .fimse
         .senao
            &StatusInserir("Lista de exclusão: [info]";"erro")[0]         
         .fimse      
      .fimse       
    .fimrepetir
#