Como capturar o numero de inscrições de um canal do youtube em tempo real
8 respostasResolvido
G
guilobo
Olá a todos.
pesquisei bastante e não achei uma solução, com o jsoup eu capturo varias informações de sites, porem deste sete especificamente (subs . nament . com . br) quero capturar o numero q aparece no meio da tela para escreve-lo em um txt. por isto preciso de ajuda.
Resumindo:
quero escrever em um txt o número q aparece no meio da tela no site subs . nament . com . br
Como fazer?
obrigado
ps. se souber alguma solução em outra linguagem, ok.
Você pode usar Selenium p/ isso…
Mapeia a página, dando procurando pela div que possuia a class "odometer-inside"
Assim você pode dar um .text() e resgatar o valor.
Como é um site bem simples, dá p/ usar o driver headless mesmo… vai ficar bem rápido e bem facil de fazer…
Da uma estudada no selenium, você vai ver que é bem simples.
Ai depois com esse valor em mãos… a parte de escrever em TXT é mais fácil ainda…
Caso nunca tenha manipulado arquivos com Java… da uma estudada … no google ta cheio de material sobre isso com exemplos…
Abs
G
guilobo
opa, obrigado vou dar uma olhada sim, e a parte do txt sei fazer sim, sem problemas.
F
Fabio_Bonnie
Analisei o site que você passou e vi que o texto a ser capturado está dentro de um div que usa o canvas do HTML.
Se não fosse canvas eu indicaria o Selenium mesmo ou HttpClient, mas como usa o canvas dá uma pesquisa sobre “get text from canvas html5” ou então “get ocr from canvas”, algo do tipo.
Se esse site fosse HTML simples te mandava até o código
F
Fabio_Bonnie2 likes
Ahhh analisando melhor o site descobri que ele usa o serviço do youtube para verificar informações sobre canais
key=AIzaSyCRtJ2uhgYe7p3J-QkC6kHsm7KZz0bDIok = key de acesso a API google, acredito que pela página do Google Developer você consegue sua key de acesso também.
fields=items/statistics/subscriberCount serve para navegar nos níveis dos dados retornados sobre o canal
Com essas informações é possível você conseguir buscar várias informações sobre o canal desejado.
@Fabio_Bonnie , de qualquer forma… o selenium ainda seria uma saída… na estrutura do html, os textos estão hierarquizados em tags div… div dentro de div … mas mesmo assim… basta pegar a div “pai” e dat um text() que ele resolve…
Porém os links que passasse consumindo direto a API é bem melhor.
G
Solucao aceita
guilobo
muuito bom, isto resolveu meu problema hehe, serio mesmo, muito obrigado
para capturar as iformaçõs da api eu utilizei o codigo abaixo, deve haver uma maneira mais elegante para isto, porem foi esta solução que encontrei.
Resumindo o código, eu leio o url com o id do canal desejado e com a api key desejada, ai eu leio a quinta linha da pagina, retiro as outras informações que nao o numero em sí, converto para inteiro e armazeno em uma variável
Então já usei várias vezes o Selenium para esse tipo de situação.
Mas analisando o site que @guilobo passou percebi que a informação que ele queria estava dentro de um canvas HTML5, e acho que não tem como pegar o valor através do Selenium (repetindo acho, tentei e não deu certo).
Se tiver alguma outra maneira posta, aí vai que um dia precisamos e não tenha o dados num webservice
publicclassGetCanvasText{privateWebDriverdriver;privateStringbaseUrl;publicstaticvoidmain(String[]args)throwsException{GetCanvasTextt=newGetCanvasText();t.setUp();t.testE();}publicvoidsetUp()throwsException{driver=newFirefoxDriver();baseUrl="http://subs.nament.com.br/";driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);}privatevoidabrirLink(Stringurl){driver.get(url);}publicvoidtestE()throwsException{abrirLink(baseUrl);StringXPATH="//span[@class='odometer-digit']";/** * Tive que usar Thread.sleep ao invés dos Waits "inteligentes" */Thread.sleep(10000);// 10 segundos// WebDriverWait wait = new WebDriverWait(driver, 5);// wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(XPATH)));List<WebElement>elementos=driver.findElements(By.xpath(XPATH));StringBuildersbConteudoSpan=newStringBuilder();for(WebElementspan:elementos){sbConteudoSpan.append(span.getText());}StringcontadorString=sbConteudoSpan.toString().trim();if(!contadorString.isEmpty()){Integercontador=newInteger(sbConteudoSpan.toString().trim());System.out.println(">>> "+contador);}else{System.out.println(">>> Problemas ao resgatar o contador! Inspecione o DOM e avalie o XPATH.");}driver.quit();}}