Como capturar o numero de inscrições de um canal do youtube em tempo real

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

opa, obrigado vou dar uma olhada sim, e a parte do txt sei fazer sim, sem problemas.

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 :grinning:

Ahhh analisando melhor o site descobri que ele usa o serviço do youtube para verificar informações sobre canais

https://www.googleapis.com/youtube/v3/channels?part=statistics&id=UCbdGvh1ETLb4dHLHXW4pQkQ&fields=items/statistics/subscriberCount&key=AIzaSyCRtJ2uhgYe7p3J-QkC6kHsm7KZz0bDIok

Onde:

  • id=UCbdGvh1ETLb4dHLHXW4pQkQ = id do canal

  • 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.

Dá uma lida nesse link https://developers.google.com/youtube/v3/docs/

2 curtidas

@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. :wink:

muuito bom, isto resolveu meu problema hehe, serio mesmo, muito obrigado :slight_smile:

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 :smile:

`URL url = new URL(“https://www.googleapis.com/youtube/v3/channels?part=statistics&id=UC_dPf-3WdzJmgAD4lMZcZ8Q&fields=items/statistics/subscriberCount&key=GOOGLEAPIKEY”);
URLConnection conn = url.openConnection();

InputStream is = url.openStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

String linha = br.readLine();
linha = br.readLine();
linha = br.readLine();
linha = br.readLine();
linha = br.readLine();
int inscritos = Integer.parseInt(linha.replace(" “subscriberCount”: “”, “”).replace(""", “”));`

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 :smile:

Desde já valeu aí por tudo

Segue tentativa:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class GetCanvasText {
private WebDriver driver;
private String baseUrl;

public static void main(String[] args) throws Exception {
	GetCanvasText t = new GetCanvasText();
	t.setUp();
	t.testE();
}

public void setUp() throws Exception {
	driver = new FirefoxDriver();
	baseUrl = "http://subs.nament.com.br/";
	driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

private void abrirLink(String url) {
	driver.get(url);
}

public void testE() throws Exception {
	abrirLink(baseUrl);
	WebElement canvas  = driver.findElements(By.tagName("canvas")).get(0);
	System.out.println(canvas.getText());
}

}

@Fabio_Bonnie,

Que tal assim? :smile:

public class GetCanvasText {

	private WebDriver driver;
	private String baseUrl;

	public static void main(String[] args) throws Exception {
		GetCanvasText t = new GetCanvasText();
		t.setUp();
		t.testE();
	}

	public void setUp() throws Exception {
		driver = new FirefoxDriver();
		baseUrl = "http://subs.nament.com.br/";
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
	}

	private void abrirLink(String url) {
		driver.get(url);
	}

	public void testE() throws Exception {

		abrirLink(baseUrl);

		String XPATH = "//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));
		StringBuilder sbConteudoSpan = new StringBuilder();

		for (WebElement span : elementos) {
			sbConteudoSpan.append(span.getText());
		}

		String contadorString = sbConteudoSpan.toString().trim();

		if (!contadorString.isEmpty()) {
			Integer contador = new Integer(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();
	}

} 

Funcionou numa boa… :wink:

Print:

Abs