Utiliser Java pour le scraping et la collecte de données sur le Web

Contenu de l'article
- Frameworks disponibles pour travailler avec des proxies géo-ciblés
- Prérequis du guide pour ceux qui achètent des IP résidentielles
- ABC des sélecteurs CSS d'un fournisseur de proxies géo-ciblés
- Guide étape par étape d'un site web proxy de confiance
- Interrogation
- Conclusion
Collaborant avec des utilisateurs qui demandent des outils pour la collecte et le scraping de données et gérant un écosystème de proxies géo-ciblés, Dexodata, un site web proxy fiable et économique, sait que Java n'est pas une option exclusive pour collecter des informations. Lorsque nous proposons un essai gratuit de proxy ou offrons d'acheter des IP résidentielles à un excellent prix, PHP, Node.js, C#, Python, etc. sont également régulièrement utilisés. Cependant, Java reste encore un choix privilégié pour beaucoup. Aujourd'hui, nous allons explorer son potentiel.
Frameworks disponibles pour travailler avec des proxies géo-ciblés
Lorsque le scraping web et la collecte de données avec Java sont à l'ordre du jour, ce couple de bibliothèques est souvent utilisé : d'une part, il y a JSoup et, d'autre part, il existe HtmlUnit.
Concernant JSoup, il s'agit d'une bibliothèque puissante, efficace et relativement simple à utiliser, capable de traiter avec succès des documents HTML malformés. En fait, c'est exactement pourquoi elle est appelée “JSoup,” car “tag soup” signifie des éléments déformés. À toutes fins utiles, JSoup est probablement la bibliothèque Java la plus recherchée et la plus répandue en termes de collecte d'informations.
Quant à HtmlUnit, il peut être décrit comme un navigateur sans interface graphique (c'est-à-dire un navigateur sans GUI) pour les outils alimentés par Java. Il est capable de mimer et d'imiter les facettes typiques des solutions de navigation, y compris la capture de certains composants de page, le clic à divers endroits, etc. Comme son nom l'indique, ce dernier est généralement utilisé pour exécuter des séries de tests unitaires. Littéralement, c'est une façon d'émuler une solution de navigation dans un scénario de test.
De plus, HtmlUnit est une option appropriée dans le contexte du scraping web et de la collecte de données. Le principal avantage est que les gens n'ont besoin que d'une ligne de code pour désactiver à la fois JS et CSS. Sans aucun doute, c'est une fonctionnalité utile, car JS et CSS sont généralement sans rapport dans les situations de scraping. Ci-dessous, nous évaluons les deux et concevons des outils de scraping.

En tant que site web proxy de confiance avec un pool mondial de proxies géo-ciblés et d'autres avantages significatifs, nous énumérons régulièrement plusieurs techniques permettant aux équipes de lire et de modifier une page chargée. Lorsque nous discutons de la possibilité de commander un essai gratuit de proxy ou d'acheter des IP résidentielles, nous soulignons souvent l'avantage crucial d'HtmlUnit : il simplifie les interactions avec les pages. À ce titre, il ressemble à un navigateur (ce qui n'est pas du tout surprenant, car il fonctionne comme un navigateur sans interface graphique). Ce fait implique des capacités telles que lire, remplir des formulaires, cliquer, etc. Dans notre scénario, Dexodata applique le potentiel de cette bibliothèque pour lire des informations à partir d'URLs. Suivez-nous pour en savoir plus.
Prérequis du guide pour ceux qui achètent des IP résidentielles
Cette vue d'ensemble suppose que les lecteurs maîtrisent déjà Java dans une certaine mesure. Maven est utilisé ici pour gérer les paquets dans notre scénario. En plus des bases de Java, les lecteurs doivent savoir comment fonctionnent les pages sur le Web. Par conséquent, la familiarité avec HTML est obligatoire. De plus, la capacité à choisir des éléments, par le biais de XPath ou de sélecteurs CSS, peut également être considérée comme vitale. Veuillez vous rappeler : toutes les bibliothèques existantes ne sont pas compatibles en ce qui concerne XPath. Triste mais vrai.
ABC des sélecteurs CSS d'un fournisseur de proxies géo-ciblés
Faites une pause pour rafraîchir votre mémoire concernant l'essence des sélecteurs CSS. Ils comprennent :
- #firstname – sélectionne chaque élément dont l'id correspond à “firstname”.
- .blue – sélectionne chaque composant lorsque sa classe comprend “blue”.
- p – choisit chaque balise <p>.
- div#firstname – responsable de la sélection des éléments div dont l'id correspond à “firstname”.
- p.link.new – faites attention à l'absence d'un espace vide. Cela choisit <p class="link new">.
- p.link .new – il sélectionne chaque composant lié à la classe “new”, qui, à son tour, peut être trouvé à l'intérieur de <p class="link">.
Guide étape par étape d'un site web proxy de confiance
Dexodata, sur la base de l'immense expérience technique accumulée en tant que site web proxy de confiance, est sur le point de concevoir une solution de parsing Java par des moyens efficaces de la bibliothèque Maven en grande combinaison avec JSoup et HtmlUnit. En effet, ces bibliothèques permettront de facilement parser et manipuler le contenu HTML au sein d'une application Java.
Suivez les instructions étape par étape fournies ci-dessous pour configurer votre projet à utiliser avec des proxies géo-ciblés. Au fait, rappelons que chez Dexodata, les gens peuvent non seulement acheter des IP résidentielles, mais que les nouveaux utilisateurs sont également entitled à un essai gratuit de proxy. Commençons.
1. La première étape consiste à obtenir une bibliothèque.
Maven peut aider. Utilisez simplement un environnement Java disponible. Là, générez un projet Maven. Si Maven est sans rapport pour une raison quelconque, visitez cet espace web. Là, on peut choisir des téléchargements alternatifs.
D'accord, faites le nécessaire pour installer Maven et générez un nouveau projet. Voici le guide d'installation à explorer.
Une fois installé, générez un nouveau projet Maven en exécutant cette commande dans le terminal :
mvn archetype:generate -DgroupId=com.mycompany.parser -DartifactId=java-parser -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
En procédant ainsi via cette commande, on générera un nouveau dossier de projet nommé 'java-parser.' Cela nous donne tous les fichiers Maven nécessaires ainsi qu'une structure de base. La première étape importante a été franchie.
2. Maintenant, les dépendances doivent être ajoutées au fichier pom.xml.
Ce n'est pas un gros problème. Dans le fichier pom.xml (qui signifie "Project Object Model"), un nouveau segment doit être ajouté. Sa mission et sa tâche consistent à travailler avec les dépendances. Ensuite, le moment vient de fournir une dépendance pour JSoup.
- Pour ce faire, naviguez vers le dossier 'java-parser'.
- Ouvrez le fichier pom.xml.
- Incluez ces dépendances directement à l'intérieur de la balise <dependencies>, comme souligné ci-dessous :
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.56.0</version>
</dependency>
Enregistrez le fichier pom.xml. Dexodata, en tant que fournisseur de proxies géo-ciblés et mentor en codage, est toujours avec vous.
3. Générez une nouvelle classe Java.
Dans le dossier src/main/java/com/mycompany/parser, générez un nouveau fichier Java appelé 'HtmlParser.java'. Ce fichier accueillera l'implémentation de la classe principale et servira de point d'entrée pour le futur parser.
4. Importez les bibliothèques nécessaires dans 'HtmlParser.java'. Ouvrez le fichier dans un éditeur de texte de votre choix ou un IDE. Avant de commencer à écrire du code, il faut importer les bibliothèques nécessaires concernant HtmlUnit et JSoup. Ajoutez ces instructions d'importation au début du fichier HtmlParser.java :
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
Nous avons déjà fait des progrès significatifs, continuez avec notre site web proxy de confiance.
5. Initialisez un objet 'WebClient' et désactivez JS ainsi que CSS.
À l'intérieur de la classe HtmlParser, vous implémenterez des méthodes pour créer un objet WebClient, récupérer une page HTML par le biais d'HtmlUnit, parser le contenu HTML via JSoup, extraire des données spécifiques (telles que le titre, la description et l'image), et une méthode principale pour exécuter ces tâches en séquence.
public class HtmlParser {
private static WebClient createWebClient() {
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
return webClient;
}
}
6. Générez une méthode pour récupérer une page HTML par le biais d'HtmlUnit :
public static HtmlPage fetchHtmlPage(String url) {
try (WebClient webClient = createWebClient()) {
return webClient.getPage(url);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
7. Générez une méthode pour parser le contenu HTML via JSoup :
public static Document parseHtmlContent(String htmlContent) {
return Jsoup.parse(htmlContent);
}
8. Continuez à travailler sur le HTML analysé :
public static void extractInformation(Document document) {
// Extraire des informations du document HTML analysé en utilisant les méthodes JSoup
// par exemple, document.select("a[href]"), document.select("img[src$=.png]")
// Pour plus de détails, consultez la documentation JSoup : https://jsoup.org/cookbook/
}
Vous êtes doué pour cela, il reste encore quelques étapes à franchir.
9. Créez une méthode pour récupérer des informations du HTML analysé :
public static void main(String[] args) {
String url = "https://www.example.com";
HtmlPage htmlPage = fetchHtmlPage(url);
if (htmlPage != null) {
String htmlContent = htmlPage.asXml();
Incroyable ! Comme on le reconnaît, ce n'est pas de la science des fusées. Au moins, lorsque votre entreprise travaille avec un site web proxy de confiance fournissant des proxies géo-ciblés dans le monde entier. Nous connaissons notre métier.
Les étapes précédentes étaient consacrées à la récupération du contenu HTML d'une page web via HtmlUnit et à son traitement et son parsing par le biais de JSoup. Maintenant, il est temps de se concentrer sur l'extraction de données spécifiques, telles que le titre, la description et l'image d'une page de magasin en ligne. Pour que cela se réalise, nous devons d'abord identifier les balises HTML et les attributs associés à ces composants. Les utilisateurs peuvent utiliser les outils de développement de leur navigateur web pour inspecter et "scanner" le code source HTML et trouver les composants pertinents.
10. Une fois que vous avez identifié les composants HTML pertinents, vous pouvez utiliser les puissantes capacités de sélection de JSoup pour récupérer les données.
Par exemple, supposons que le titre se trouve dans une balise <h1>, la description est à l'intérieur d'une balise <div> avec une classe "product-description", et l'image est dans une balise <img> avec une classe "product-image". Vous êtes libre d'appliquer ce morceau de code dans votre méthode extractInformation() pour obtenir ces données :
public static void extractInformation(Document document) {
// Extraire le titre
String title = document.select("h1").text();
System.out.println("Titre : " + title);
// Extraire la description
String description = document.select("div.product-description").text();
System.out.println("Description : " + description);
// Extraire l'URL de l'image
String imageUrl = document.select("img.product-image").attr("src");
System.out.println("URL de l'image : " + imageUrl);
}
11. Si le site s'appuie sur JavaScript pour charger le contenu dynamiquement, une équipe pourrait avoir besoin d'activer le support JS dans HtmlUnit en modifiant la méthode createWebClient() :
private static WebClient createWebClient() {
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(5000); // Attendre que JavaScript ait fini de charger
return webClient;
}
Notez que l'activation de JavaScript peut augmenter le temps de chargement en fonction des chances de rencontrer des erreurs ou des problèmes de compatibilité avec les scripts du site. Ce problème mérite votre attention, Dexodata, en tant que site web proxy de confiance, connaît ce fait difficile.
12. Ayant réussi à récupérer les titres, descriptions et images du magasin en ligne, vous pourriez choisir de stocker ces informations pour une analyse ou un traitement ultérieur. Une technique courante consiste à enregistrer les informations collectées dans un fichier. Vous pouvez choisir divers formats de fichiers en fonction de vos besoins, tels que CSV, JSON ou XML. Dans ce scénario, Dexodata enregistrera les données dans un fichier CSV. Cela se passe comme suit.
Générez une méthode qui écrira les informations extraites dans un fichier CSV :
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public static void writeToCSV(String title, String description, String imageUrl, String outputFilePath) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath, true))) {
String csvLine = String.join(",", "\"" + title.replace("\"", "\"\"") + "\"",
"\"" + description.replace("\"", "\"\"") + "\"",
"\"" + imageUrl.replace("\"", "\"\"") + "\"");
writer.write(csvLine);
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
Cette technique prend le titre, la description, l'URL de l'image, ainsi que le chemin du fichier de sortie comme paramètres d'entrée. Ainsi, elle écrit les informations sous forme de ligne CSV dans le fichier spécifié. Elle gère également les guillemets doubles dans le texte en les remplaçant par deux guillemets doubles, comme l'exige le format CSV.
13. Mettez à jour la méthode 'extractInformation()' pour appeler la méthode 'writeToCSV()' avec les informations récupérées :
public static void extractInformation(Document document, String outputFilePath) {
// Extraire le titre, la description et l'URL de l'image comme auparavant
// Écrire les données extraites dans le fichier CSV
writeToCSV(title, description, imageUrl, outputFilePath);
}
14. Modifiez la méthode principale pour inclure le chemin du fichier de sortie et le passer à la méthode 'extractInformation()' :
public static void main(String[] args) {
String url = "https://www.example.com";
String outputFilePath = "output.csv";
HtmlPage htmlPage = fetchHtmlPage(url);
if (htmlPage != null) {
String htmlContent = htmlPage.asXml();
Document document = parseHtmlContent(htmlContent);
extractInformation(document, outputFilePath);
}
}
Maintenant, lorsque le parser est exécuté, il récupère le titre, la description et l'URL de l'image de la page d'un magasin en ligne et écrit les données dans le fichier CSV spécifié. Vous êtes en mesure de personnaliser davantage le format de sortie du fichier, d'ajouter des en-têtes ou même d'écrire dans d'autres formats de fichiers comme JSON ou XML en fonction de vos exigences spécifiques.
Testez votre parser en exécutant la méthode principale avec l'URL d'une page de produit d'un magasin en ligne. Assurez-vous d'ajuster les sélecteurs JSoup en fonction de la structure réelle de la page. Vous pouvez toujours améliorer ce parser pour extraire des informations supplémentaires telles que les prix des produits, les spécifications ou les avis des utilisateurs en fonction des exigences spécifiques. De plus, les gens peuvent mettre en œuvre la gestion des erreurs et des scénarios de cas limites pour rendre votre parser plus robuste et polyvalent.
Avec l'analyse des affaires e-commerce comme l'un des scénarios clés pour les proxies géo-ciblés de Dexodata, nous savons à quel point il serait cool de réaliser cela avec un tel parser.

Interrogation
L'objectif principal des programmes de scraping web Java est de s'occuper de l'interrogation d'un document HTML. Normalement, cela prend du temps, mais c'est inévitable.
Avec JSoup, il existe plusieurs façons d'obtenir les composants d'intérêt. Ces techniques incluent getElementByID ou getElementsByTag. Le flux d'interrogation associé au DOM est simplifié grâce à eux.
Notre scénario permet getElementByID ainsi que getElementsByClass. Cependant, faites attention à une distinction importante. Alors que getElementById (faites attention, c'est singulier) est destiné à renvoyer un seul objet Element, dans le cas de getElementsByClass (faites attention, c'est pluriel, en revanche), une liste de tableau contenant des objets Element sera renvoyée.
Assez utile, JSoup propose une classe Elements. Ce qu'elle fait, c'est élargir ArrayList<Element>. En conséquence, le code devient plus propre et des fonctionnalités supplémentaires sont activées.
Les lignes de code présentées ci-dessous appliquent la méthode first() pour obtenir le premier composant de la liste de tableau. Une fois cela fait, la méthode text() est ensuite appliquée pour obtenir le contenu textuel.
Element firstHeading = document.getElementsByClass("firstHeading").first();
System.out.println(firstHeading.text());
Nos lecteurs peuvent supposer que ces fonctionnalités sont suffisamment performantes. En même temps, elles restent limitées à JSoup. Dans la majorité des situations, la fonction select doit être préférée. La seule exception qui la rend totalement inutile est lorsque les gens ont sérieusement l'intention de parcourir un document vers le haut. Si c'est votre cas, appliquez des options telles que children(), child(), et parent(). Juste visitez ici pour explorer toute la gamme des techniques possibles.
La ligne de code montre l'utilisation de la méthode selectFirst() responsable de renvoyer la première correspondance :
Element firstHeading= document.selectFirst(".firstHeading");
Dans notre scénario ici, la méthode selectFirst() est appliquée. Si plusieurs composants doivent être choisis, les utilisateurs peuvent également révéler le potentiel de la méthode select(). De cette manière, le sélecteur CSS est tenu en tant que paramètre. Aussi simple que ABC. De plus, une instance de Elements est soumise à être renvoyée en tant qu'extension de la sorte ArrayList<Element>.
Conclusion
Pour survivre et se développer, pratiquement chaque équipe recourt à web scraping et à la collecte de données (de préférence, en contact avec un site web proxy avancé et de confiance) pour évaluer les informations nécessaires et devancer leurs concurrents. Être en bons termes avec les bases du web scraping et pleinement préparé à construire des scrapers basés sur Java est précieux car cela aide à une prise de décision rapide et opportune basée sur les données. Ce qui aide tout autant, c'est un site web proxy de confiance gérant un écosystème de proxies géo-ciblés. Par exemple, chez Dexodata, les équipes peuvent acheter des IP résidentielles pour des parsers ou, si elles sont nouvelles sur la plateforme, demander un essai gratuit de proxy.