In this Article
Como Java é uma linguagem independente de plataforma, com bibliotecas robustas, recursos de multithreading e mecanismos eficazes de tratamento de erros, ela é uma boa opção para web scraping. Neste tutorial detalhado, mostramos quais ferramentas você precisa e quais etapas deve seguir para agilizar a scraping em Java.
Web scraping com Java: pontos-chave
Embora linguagens mais simples, como Python, sejam mais populares para web scraping, Java também tem seus pontos fortes, por exemplo:
- Bibliotecas como JSoup ou HtmlUnit simplificam a análise de HTML
- Desempenho, velocidade e gerenciamento eficiente de memória tornam Java adequado para projetos de grande escala
- Por ser uma linguagem fortemente tipada, Java permite detectar erros em tempo de compilação
Além disso, se sua infraestrutura depende de Java ou se você trabalha com projetos de longo prazo, Java também é uma opção. Ao mesmo tempo, a web scraping costuma trazer desafios como bloqueios de IP, limitações geográficas e preocupações de segurança. Usar proxies no seu projeto Java ajuda a superar esses obstáculos e obter os dados necessários.
Antes de partir para o código, veja quais ferramentas você vai precisar:
- Visual Studio Code (na verdade, Visual Studio 2022 ou qualquer outro IDE compatível com Java serve)
- Coding Pack for Java
- Extension Pack for Java
- Apache Maven
Se você está começando com Visual Studio Code ou Java, aqui há uma documentação com explicações detalhadas sobre como instalar o Coding Pack e o Extension Pack. Este tutorial também pode ajudar sobre a instalação do Apache Maven.
Observação: apenas o formato “hostname:port” é compatível, então você precisará colocar seu endereço IP na lista de permissões antes de executar o código. Você pode fazer isso na sua conta DataImpulse. Acesse o plano de proxy correspondente, selecione “Manage Whitelist IPs” no menu superior direito e adicione seu endereço à lista de permissões. Se precisar de ajuda ou tiver problemas, consulte nosso guia detalhado sobre como gerenciar sua conta DataImpulse.
Primeiros passos com HttpClientApp
Você deve criar um cliente HTTP para rotear o tráfego por meio de um servidor proxy. Este app envia solicitações para a URL designada e recebe respostas. Você pode usar o código abaixo:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class HttpClientApp {
public static final String proxyHost = "gw.dataimpulse.com";
public static final int proxyPort = 823;
public static void main(String[] args) {
System.out.println("Performing request through proxy...");
try {
String response = request("https://api.ipify.org");
System.out.println("Your IP address: " + response);
} catch (IOException e) {
System.err.println("Request error: " + e.getMessage());
}
}
public static String request(String url) throws IOException {
// Configure the proxy without authentication
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
// Create and configure the connection
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");
// Handle the response
int responseCode = connection.getResponseCode();
String responseMessage = connection.getResponseMessage();
if (responseCode == 200) {
// Successful response
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
} else {
// Error response with detailed output
StringBuilder errorResponse = new StringBuilder();
if (connection.getErrorStream() != null) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getErrorStream()))) {
String line;
while ((line = reader.readLine()) != null) {
errorResponse.append(line);
}
}
}
throw new IOException("HTTP error: " + responseCode + " " + responseMessage +
(errorResponse.length() > 0 ? "\nError details: " + errorResponse : ""));
}
}
}
A saída deve ficar assim:
Criando um proxy rotator
Rotear o tráfego por meio de um servidor proxy não é suficiente. Para aumentar a privacidade, você deve usar um novo IP para cada solicitação. É por isso que você precisa de um proxy rotator. Veja um exemplo de código que você pode usar:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Arrays;
import java.util.List;
public class ProxyRotator {
// List of proxies to rotate through
private static final List proxies = Arrays.asList(
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10000)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10001)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10002))
);
public static void main(String[] args) {
// URL to request
String url = "https://api.ipify.org";
for (Proxy proxy : proxies) {
System.out.println("Using proxy: " + proxy.address());
try {
String response = sendRequestWithProxy(url, proxy);
System.out.println("Request succeeded with proxy " + proxy.address());
System.out.println("IP address from API website: " + response);
} catch (IOException e) {
System.err.println("Request failed with proxy " + proxy.address() + ": " + e.getMessage());
}
System.out.println("------------------------------------------------");
}
}
// Function to send request using a specific proxy
private static String sendRequestWithProxy(String url, Proxy proxy) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
} else {
throw new IOException("HTTP error code: " + responseCode + " " + connection.getResponseMessage());
}
}
}
Você deve obter este resultado:
Criando um proxy checker
É hora de garantir que nossos proxies funcionem com um site definido. Para isso, você precisa criar um app de proxy checker e fornecer uma URL para verificar:
Há um código que você pode testar:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Arrays;
import java.util.List;
public class ProxyChecker {
// List of proxies to rotate through
private static final List proxies = Arrays.asList(
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10000)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10001)),
new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10002))
);
// Website to check through proxies
private static final String websiteUrl = "https://api.ipify.org";
public static void main(String[] args) {
System.out.println("Starting Proxy Checker...");
for (Proxy proxy : proxies) {
System.out.println("\nChecking proxy: " + proxy.address());
try {
boolean isWorking = checkProxy(proxy, websiteUrl);
if (isWorking) {
System.out.println("✅ Proxy " + proxy.address() + " works with " + websiteUrl);
} else {
System.out.println("❌ Proxy " + proxy.address() + " does not work with " + websiteUrl);
}
} catch (IOException e) {
System.out.println("❌ Proxy " + proxy.address() + " failed: " + e.getMessage());
}
System.out.println("------------------------------------------------");
}
}
// Function to check if proxy works with the given website
private static boolean checkProxy(Proxy proxy, String url) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");
connection.setConnectTimeout(5000); // 5 seconds timeout
connection.setReadTimeout(5000); // 5 seconds timeout
int responseCode = connection.getResponseCode();
String responseMessage = connection.getResponseMessage();
System.out.println("Response: " + responseCode + " " + responseMessage);
if (responseCode == 200) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
System.out.println("IP Returned: " + response);
}
return true;
} else {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getErrorStream()))) {
StringBuilder errorResponse = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
errorResponse.append(line);
}
System.out.println("Error details: " + errorResponse);
}
return false;
}
}
}
Os resultados exibidos devem ficar assim:
Passando para o web scraping em si
Por fim, é hora de criar um app de web scraping. Ele extrairá todos os dados necessários, então você deve fornecer a URL de destino para raspagem e especificar quais dados deseja que o programa recupere. No nosso caso, vamos fazer scraping de links da nossa página inicial. Você pode usar este código como referência:
package com.dataimpulse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class ProxyWebScraper {
// Proxy configuration
private static final String PROXY_HOST = "gw.dataimpulse.com";
private static final int PROXY_PORT = 823;
// Target website to scrape
private static final String TARGET_URL = "https://dataimpulse.com/";
public static void main(String[] args) {
System.out.println("Starting Proxy Web Scraper...");
try {
// Perform the web scraping through the proxy
String htmlContent = getHtmlContent(TARGET_URL);
if (htmlContent != null) {
// Parse and extract links from the HTML content
parseHtml(htmlContent);
} else {
System.out.println("Failed to retrieve HTML content.");
}
} catch (IOException e) {
System.err.println("Error during scraping: " + e.getMessage());
}
}
// Method to get HTML content through the proxy
private static String getHtmlContent(String url) throws IOException {
// Configure proxy
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
// Create and configure the connection
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "JavaWebScraper/1.0");
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
// Read and return the HTML content
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line);
}
return content.toString();
}
} else {
System.err.println("Failed to fetch HTML. HTTP error code: " + responseCode);
return null;
}
}
// Method to parse HTML and extract links using jsoup
private static void parseHtml(String htmlContent) {
Document doc = Jsoup.parse(htmlContent);
Elements links = doc.select("a[href]");
if (links.isEmpty()) {
System.out.println("No links found on the page.");
} else {
System.out.println("Links found:");
for (Element link : links) {
String href = link.attr("abs:href");
String title = link.text();
System.out.println("Title: " + title + ", Link: " + href);
}
}
}
}
No entanto, há mais uma coisa que você precisa fazer. Para finalizar o processo e garantir que seu app de raspagem funcione corretamente, você precisa instalar a biblioteca JSoup usando Maven. Veja uma explicação passo a passo de como fazer isso:
- Crie um projeto Java usando o botão correspondente.
- Selecione Maven como o tipo de projeto.
- Na lista exibida, escolha “maven-archetype-quickstart”:
- Insira “com.dataimpulse” como group id.
- Digite “proxy-scraper” no campo “artifact Id”.
- Escolha uma pasta para armazenar a biblioteca e o próprio app ProxyWebScraper. Depois disso, a pasta proxy-scraper deverá aparecer. Agora, mova o código para proxy-scraper/src/main/java/com/dataimpulse:
- Adicione a biblioteca JSoup via Apache Maven, como mostrado na captura de tela abaixo. Se você fizer corretamente, a biblioteca aparecerá no arquivo “pom.xml”.
- No arquivo “pom.xml”, altere os parâmetros “maven.compiler.source” e “maven.compiler.target” para 1.8. Salve o arquivo usando CTRL+S no Windows ou CMD+S no Mac.
- Agora seu código deve funcionar corretamente. Para executá-lo, use o botão no canto superior direito da tela.
Aqui está o resultado final do nosso projeto de scraping:
Como você pode ver, agora temos todos os dados que queríamos. No entanto, ao modificar o código, você pode obter qualquer dado HTML de que precisar. Além disso, você deve escolher proxies com cuidado, pois esse tipo de resultado não é possível sem IPs de origem legal. Na DataImpulse, você pode obter 15 milhões de endereços obtidos de forma ética e não associados a atividades ilegais, como disseminação de software malicioso. Se tiver qualquer dificuldade, nossa equipe de suporte humano está à sua disposição 24/7. Você também pode ajustar a segmentação para alinhá-la às políticas de acesso territorial. Ao mesmo tempo, nossos proxies não vão estourar seu orçamento, pois trabalhamos com um modelo de preços de pagamento conforme o uso e oferecemos um preço acessível de $1 por 1GB. Comece conosco em [email protected] ou use o botão “Experimente agora” no canto superior direito da tela.















