[JAVA] Gratte de sites Web avec jsoup

À propos de cet article

Notez que j'ai eu l'occasion de gratter un site Web en utilisant la bibliothèque jsoup de Java. Il existe déjà de nombreux articles qui expliquent en détail de manière facile à comprendre, mais il s'agit d'un mémo. Officiel: https://jsoup.org/

Méthode d'introduction

Récupérez simplement le fichier jar sur la page de téléchargement du site officiel et ajoutez-le à la bibliothèque. Il peut également être installé à partir du référentiel Maven. Si c'est gradle, ajoutez simplement la définition suivante à build.gradle (la version est la plus récente au moment de l'écriture)

build.gradle


dependencies {
	compile('org.jsoup:jsoup:1.12.1')
}

Exemple d'utilisation

Prenons comme exemple le cas de l'extraction de la date, du titre et de l'URL de "Notice" de la page suivante.

<body> 
 <div class="section"> 
  <div class="block"> 
   <dl>
    <dt>2019.08.04</dt> 
    <dd>
     <a href="http://www.example.com/notice/0003.html">Avis 3</a>
    </dd> 
    <dt>2019.08.03</dt> 
    <dd>
     <a href="http://www.example.com/notice/0002.html">Avis 2</a>
    </dd> 
    <dt>2019.08.02</dt> 
    <dd>
     <a href="http://www.example.com/notice/0001.html">Avis 1</a>
    </dd> 
   </dl>
  </div>
 </div>
</body>

Extrayez avec le code suivant.

Example.java


import java.io.IOException;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;

public class Example {

	public static void main(String[] args) throws IOException {

		//Get en envoyant une requête avec GET à l'URL spécifiée (post()POST est également possible s'il s'agit d'une méthode)
		Document document = Jsoup.connect("http://www.example.com").get();

		//Extrayez les éléments du document acquis avec le sélecteur CSS.
		//Cet élément est dans le HTML ci-dessus<div class="block">Liste de taille 1 qui correspond à l'élément de
		Elements elements = document.select(".section .block");

		//Obtenez le 0e élément des éléments, puis récupérez ses éléments enfants.
		// elements.get(0).childNode(0)= Dans le HTML ci-dessus<dl>Des éléments de
		// elements.get(0).childNode(0).childNodes() = <dl>De l'enfant<dt>Quand<dd>Liste des éléments de
		List<Node> nodeList = elements.get(0).childNode(0).childNodes();

		//Extrayez la date, le titre et l'URL de la notification à partir de nodeList avec une boucle for.
		for (int i = 0; i < nodeList.size() / 2; i++) {
			String newsDate = nodeList.get(i * 2).toString();
			String newsTitle = nodeList.get(i * 2 + 1).childNode(0).toString();
			String newsUrl = nodeList.get(i * 2 + 1).childNode(0).attr("href");

			System.out.println(newsDate);
			System.out.println(newsTitle);
			System.out.println(newsUrl);
		}
	}
}

La documentation des classes utilisées dans ce code est ci-dessous. Vous devriez le lire avant de l'utiliser.

Document(jsoup Java HTML Parser 1.12.1 API) Elements(jsoup Java HTML Parser 1.12.1 API) Element(jsoup Java HTML Parser 1.12.1 API) Node(jsoup Java HTML Parser 1.12.1 API)

À propos de l'utilisation réelle

Je l'utilise pour gratter la page d'annonce sur le site de l'école doctorale où mes proches sont inscrits.

La page «Avis de l'université» sur le site Web de l'université, en gros, seuls les avis qui ne vous concernent pas sont affichés. Les avis importants sont publiés environ une fois tous les quelques mois, vous devez donc les regarder souvent, ce qui est un problème. Par conséquent, j'ai décidé de créer un lot qui effectue le traitement suivant et de l'exécuter avec cron une fois par heure.

J'ai eu du mal à envoyer des e-mails en Java. J'écrirai à ce sujet plus tard.

Article de référence

Mémo d'utilisation de jsoup: https://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7

Recommended Posts

Gratte de sites Web avec jsoup
Scraping Web facile avec Jsoup
Analyse HTML (scraping) avec JAVA
Grattage avec jsoup pour obtenir le classement "J'aime" des organisations Qiita
Grattage avec marionnettiste à Nuxt sur Docker.
[Java + jsoup] Scraping des produits Mercari à vendre