Pratique de grattage avec Java ②

Cliquez ici pour l'article précédent (https://qiita.com/suisen/items/a856c06accdab922153c)

Grattage avec Java ②

Référence / Site Java une petite référence (https://java-reference.com/java_string_tonumber.html) M. TECH PROJIN (https://tech.pjin.jp/blog/2017/10/17/ [java] Exemple de code de sortie CSV /) M. Samurai Yamashita (https://www.sejuku.net/blog/20746) Programmation Let's (https://www.javadrive.jp/start/stream/index6.html)

Dernier examen

① Je voulais gratter. (2) J'ai téléchargé et défini jsoup.jar et créé un exemple de code. (3) Il a été confirmé que les caractères peuvent être extraits de la spécification de balise sur Yahoo! Et d'autres sites.

Ce que je veux faire cette fois

① Obtention d'informations sur les résultats telles que les courses de chevaux à partir de netKeiba (http://www.netkeiba.com/) (2) Exporter vers un fichier csv pouvant être utilisé avec Excel, etc.

Histoire principale

Donc, je l'ai assemblé. Je suis encore immature, donc je me fiche du temps et de l'efficacité. Je pense qu'il est significatif de l'acquérir pour le moment. Veillez également à ne pas en faire trop car vous entendez souvent que le grattage met une charge sur l'autre partie.

Tout d'abord, à partir du code (je suppose que je dois le classer à l'origine, mais comme il s'agit d'un échantillon, je vais le mettre ensemble)

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

public class Test6 {

	/**
	 *Préparation à l'export au format csv ⇒ Spécifier l'URL ⇒ Web scraping avec jsoup ⇒ List as Java Beans
	 *⇒ Ecrire la liste au format csv ⇒ Gestion des exceptions avec l'instruction catch ⇒ Fermer le flux
	 */
	public static void main(String[] args) {

		//Pour mesurer le temps d'exécution
		long start = System.currentTimeMillis();

		//Initialisation de l'exportation csv
		BufferedWriter bw=null;


		//try-Besoin d'une déclaration de capture
		try {
			//Décrivez le nom du fichier de destination d'exportation dans la première colonne
			bw=new BufferedWriter(new FileWriter("D:\\sakura\\ScrapingHtml\\scraping.csv", true));
			bw.write("Nom du cheval,Date,Tenu,Météo,Nom de la course,Numéro de cheval,Populaire,Ordre d'arrivée,Cavalier,distance,Statut,temps");
			bw.newLine();

			//Remplacez la dernière phrase de l'url par un nombre.
			for(int j = 2015100001; j<=2015100010; j++) {

				//Générer une liste à stocker dans TestBeans préparé séparément
				List<TestBeans> list = new ArrayList<TestBeans>();

				//Document A = Jsoup.connect("url").get();Scraping de la cible sur l'URL
				Document doc = Jsoup.connect("http://db.netkeiba.com/horse/"+j).get();

				//Elements B = A.select("marque"); この形でソースに含まれるmarqueで指定された範囲を書き出す。
				Elements elm = doc.select("tbody tr");
				Elements title = doc.select("title");

				//Se préparer à afficher le nom du cheval
				//Prenez approximativement le nombre de caractères, et s'il y a un blanc, coupez-le.
				String tstr = title.text().substring(0, 10);
				int i = tstr.indexOf(" ");

				if(i==-1) {
					i=10;
				}
				String tstrs = tstr.substring(0, i);

				//Initialisez la chaîne pour l'utiliser ci-dessous
				String str=null;
				//Stocker les éléments dans TestBeans avec instruction for étendue
				for(Element a : elm) {
					str = a.text();
					//Je souhaite exclure l'exclusion, l'annulation et l'annulation de la course.
					if(str.indexOf("Exclusion")!=-1 || str.indexOf("Tori")!=-1 ||str.indexOf("Pendant ~")!=-1) {
						continue;
					}
					//Je ne veux que des informations sur la race, mais je ne pouvais pas les réduire en spécifiant simplement les balises ci-dessus, j'ai donc décidé par le nombre de caractères.
					if(str.length()>=70) {
						String hairetsu[] = str.split(" ");
						TestBeans bean = new TestBeans();
						bean.setDate(hairetsu[0]);
						bean.setPlace(hairetsu[1]);
						bean.setWeather(hairetsu[2]);
						bean.setRaceName(hairetsu[4]);
						bean.setHorseNo(Integer.parseInt(hairetsu[7]));
						bean.setFamous(Integer.parseInt(hairetsu[9]));
						bean.setScore(Integer.parseInt(hairetsu[10]));
						bean.setJockey(hairetsu[11]);
						bean.setCycle(hairetsu[13]);
						bean.setSituation(hairetsu[14]);
						bean.setTime(hairetsu[16]);

						//Stocker dans la liste
						list.add(bean);
					}
				}

				//Exportez vers un fichier csv avec l'instruction for étendue. Séparé par des virgules pour une compréhension facile
				for(TestBeans tb : list) {
					bw.write(tstrs);
					bw.write(",");
					bw.write(tb.getDate()+","+tb.getPlace()+","+tb.getWeather()+","+tb.getRaceName()+","+tb.getHorseNo()+","+tb.getFamous()+","+tb.getScore()+","+tb.getJockey()+","+tb.getCycle()+","+tb.getSituation()+","+tb.getTime());
					bw.newLine();
				}
			}
			//fermer le traitement.
			bw.close();
			System.out.println("Terminé");

		//Gestion des exceptions
		}catch(IOException e) {
			e.printStackTrace();
		}catch(NumberFormatException e) {
			e.printStackTrace();

		//Au cas où, assurez-vous de le fermer avec une instruction finally. Je ne sais pas si c'est nécessaire.
		}finally {
			try {
				if(bw!=null) {
					bw.close();
				}
			}catch(IOException e) {
				e.printStackTrace();
			}
		}

		//Pour mesurer le temps d'exécution
		long end = System.currentTimeMillis();
		System.out.println((end - start)  + "ms");
		System.out.println((end-start)/1000 + "Secondes");
	}
}

Le résultat est correctement écrit sous forme de fichier csv. 2.PNG 3.PNG Je comprends que cela prend trop de temps.

Explication supplémentaire

Peu de choses ont été ajoutées depuis le dernier code.

Mesure du temps d'exécution

Tout d'abord, juste pour mesurer la vitesse d'exécution

//実行時間計測用 long start = System.currentTimeMillis();

//実行時間計測用 long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); System.out.println ((fin-début) / 1000 + "secondes");

Introduit. Ceci n'est qu'une mesure, donc cela n'a rien à voir avec cet objectif.

Exporter au format csv

//csv書き出しの初期化 BufferedWriter bw=null;

//close処理。 bw.close(); System.out.println ("Terminé");

//例外処理 }catch(IOException e) { e.printStackTrace(); }catch(NumberFormatException e) { e.printStackTrace();

//念のためfinally文で確実にcloseできるよう図る。必要かどうかは不明。 }finally { try { if(bw!=null) { bw.close(); } }catch(IOException e) { e.printStackTrace(); } } Exportez vers l'extérieur avec la classe BufferedWriter. Il est pratique de définir d'abord la valeur null d'initialisation. J'écrirai plus à ce sujet plus tard, mais comme je dois le fermer, je le ferme immédiatement après la fin de l'instruction big for. J'ai également ajouté «Done» à la console pour indiquer que c'était fait.

De plus, la gestion des exceptions est requise, donc IOException sera utilisé pour tous. En ce qui concerne NumberFormatException qui est inclus ensemble, il s'agit d'une exception à ce moment-là car le type String est converti en type Integer. Je le ferme, mais j'étais inquiet si je pouvais le faire, alors je l'ai écrit dans la déclaration finale. C'est subtile si c'est nécessaire ici, et il semble y avoir un moyen de bien l'écrire.

Traitement itératif de l'URL

Dans le cas de la page de chevaux, netkeiba utilisé cette fois semblait avoir les numéros à la fin de l'url dans l'ordre, donc je devrais le répéter avec l'instruction for.

			//Remplacez la dernière phrase de l'url par un nombre.
			for(int j = 2015100001; j<=2015100010; j++) {

				//Générer une liste à stocker dans TestBeans préparé séparément
				List<TestBeans> list = new ArrayList<TestBeans>();

				//Document A = Jsoup.connect("url").get();Scraping de la cible sur l'URL
				Document doc = Jsoup.connect("http://db.netkeiba.com/horse/"+j).get();
Matière

C'est le processus principal. Il est stocké dans la liste des choses lues à l'aide de JavaBeans. Les Java Beans utilisés cette fois sont les suivants.

public class TestBeans {

	private String date;
	private String place;
	private String weather;
	private int race;
	private String raceName;
	private int member;
	private int groupNo;
	private int horseNo;
	private float oz;
	private int famous;
	private int score;
	private String jockey;
	private int kinryo;
	private String cycle;
	private String situation;
	private String time;
	private int weight;
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getPlace() {
		return place;
	}
	public void setPlace(String place) {
		this.place = place;
	}
	public String getWeather() {
		return weather;
	}
	public void setWeather(String weather) {
		this.weather = weather;
	}
	public int getRace() {
		return race;
	}
	public void setRace(int race) {
		this.race = race;
	}
	public String getRaceName() {
		return raceName;
	}
	public void setRaceName(String raceName) {
		this.raceName = raceName;
	}
	public int getMember() {
		return member;
	}
	public void setMember(int member) {
		this.member = member;
	}
	public int getGroupNo() {
		return groupNo;
	}
	public void setGroupNo(int groupNo) {
		this.groupNo = groupNo;
	}
	public int getHorseNo() {
		return horseNo;
	}
	public void setHorseNo(int horseNo) {
		this.horseNo = horseNo;
	}
	public float getOz() {
		return oz;
	}
	public void setOz(float oz) {
		this.oz = oz;
	}
	public int getFamous() {
		return famous;
	}
	public void setFamous(int famous) {
		this.famous = famous;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	public String getJockey() {
		return jockey;
	}
	public void setJockey(String jockey) {
		this.jockey = jockey;
	}
	public int getKinryo() {
		return kinryo;
	}
	public void setKinryo(int kinryo) {
		this.kinryo = kinryo;
	}
	public String getCycle() {
		return cycle;
	}
	public void setCycle(String cycle) {
		this.cycle = cycle;
	}
	public String getSituation() {
		return situation;
	}
	public void setSituation(String situation) {
		this.situation = situation;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public int getWeight() {
		return weight;
	}
	public void setWeight(int weight) {
		this.weight = weight;
	}



}

Eclipse est excellent, n'est-ce pas? Si vous définissez le type et le nom de manière privée, le getter et le setter seront définis automatiquement. Je vous remercie.

Ceci est stocké dans la liste par le traitement suivant.

				//Initialisez la chaîne pour l'utiliser ci-dessous
				String str=null;
				//Stocker les éléments dans TestBeans avec instruction for étendue
				for(Element a : elm) {   ㋐
					str = a.text();   ㋑
					//Je souhaite exclure l'exclusion, l'annulation et l'annulation de la course.
					if(str.indexOf("Exclusion")!=-1 || str.indexOf("Tori")!=-1 ||str.indexOf("Pendant ~")!=-1) {
						continue;
					}   ㋒
					//Je ne veux que des informations sur la race, mais je ne pouvais pas les réduire en spécifiant simplement les balises ci-dessus, j'ai donc décidé par le nombre de caractères.
					if(str.length()>=70) {
						String hairetsu[] = str.split(" ");  ㋓
						TestBeans bean = new TestBeans();
						bean.setDate(hairetsu[0]);
						bean.setPlace(hairetsu[1]);
						bean.setWeather(hairetsu[2]);
						bean.setRaceName(hairetsu[4]);
						bean.setHorseNo(Integer.parseInt(hairetsu[7]));
						bean.setFamous(Integer.parseInt(hairetsu[9]));
						bean.setScore(Integer.parseInt(hairetsu[10]));
						bean.setJockey(hairetsu[11]);
						bean.setCycle(hairetsu[13]);
						bean.setSituation(hairetsu[14]);
						bean.setTime(hairetsu[16]);  ㋔

						//Stocker dans la liste
						list.add(bean);  ㋕
					}
				}

Il n'y a rien de tel. ㋐ Convertissez l'orme multiple lu (type Eléments) en un (Type d'élément) composé de phrases courtes avec l'instruction for étendue. ㋑ Réglez sur str (type String) qui a été initialisé à l'avance. ㋒ Si les informations que vous souhaitez exclure sont incluses, continuez à sortir de l'instruction for. ㋓ Puisqu'une phrase est séparée par des blancs, récupérez-les sous forme de tableau de type String. ㋔ Stockez les pièces nécessaires dans TestBeans à l'aide du setter TestBeans. Passez du type String au type Integer selon le cas. ㋕ Ajouter à la liste des types TestBean.

Ecrire plus intelligemment n'était pas possible avec mes capacités à ce stade.

S'agit-il des détails? Quoi qu'il en soit, j'ai pu sortir au format csv. Je n'en ai essayé que 10, alors j'aimerais voir combien de temps cela prendra avec un nombre légèrement plus grand.

S'il vous plaît laissez-nous savoir dans les commentaires, etc. si vous remarquez quelque chose, quelque chose d'étrange ou une meilleure façon.

Postscript

Merci pour vos conseils et commentaires de saka1029. C'est certainement plus facile que de distinguer par le nombre de caractères. Je vais me consacrer.

Aussi, j'ai réalisé qu'il était plus facile de gratter l'écran des résultats du concours, mais j'ai fait semblant de ne pas le remarquer.

Recommended Posts

Pratique de grattage avec Java ②
Pratique du grattage avec Java ①
Essayez de gratter en utilisant Java [Note]
java pratique partie 1
Janken jeu java pratique
Pratique de l'API Java8 Stream
J'ai essayé de gratter un graphique boursier en utilisant Java (Jsoup)
Essayez d'utiliser RocksDB avec Java
Utilisation de Mapper avec Java (Spring)
J'ai essayé d'utiliser Java REPL
Utilisation de Docker depuis Java Gradle
Analyse HTML (scraping) avec JAVA
Faire un diamant en utilisant Java
Tri des bulles à l'aide de ArrayList (JAVA)
OSX 10.15 (Catalina) Utilisation de Java avec β
Exporter un problème à l'aide de l'API Java de JIRA
Chiffrer à l'aide du chiffrement RSA en Java
Télécharger des fichiers à l'aide de Java HttpURLConnection
Comparaison Java à l'aide de la méthode compareTo ()
Essayez d'utiliser Redis avec Java (jar)
[Java] Élimination du code de plaque de chaudière à l'aide de Lombok
Gestion des fuseaux horaires avec Java
Créer un projet Java à l'aide d'Eclipse
Java
[Entraine toi! ] Paramètres minimum lors de l'utilisation de MyBatis
Exception inattendue lors de l'utilisation de DateTimeFormatter de Java
J'ai essayé d'utiliser l'API Java8 Stream
Utilisation de Java avec AWS Lambda-Eclipse Préparation
[Java] Élimination du code de plaque de chaudière avec Lombok 2
[Java] Essayez de mettre en œuvre à l'aide de génériques
Connexion HTTPS utilisant tls1.2 dans Java 6
J'ai essayé d'utiliser JWT en Java
Développement HTML5 par Java avec TeaVM
Comment formater enum à l'aide de formatter-maven-plugin (Java)
[Entraine toi! ] Liaison de base de données Java (Connector / J 8.0.20)
Essayez d'utiliser le traçage de méthode IBM Java
Java
Suppression de fichiers à l’aide du traitement récursif [Java]
Résumé de la programmation orientée objet utilisant Java
Exemple de code utilisant Minio de Java
Utilisation du service proxy avec l'exploration Java
J'ai essayé d'utiliser le mémo Java LocalDate
Essayez d'utiliser le SDK Java d'Hyperledger Iroha
[Java] Où avez-vous essayé d'utiliser java
J'ai essayé d'utiliser Google HttpClient de Java
Essayez d'utiliser le framework Java Nablarch [Application Web]
J'ai essayé d'utiliser l'API Elasticsearch en Java
Utilisation de Java avec des arguments CloudWatch AWS Lambda-Implementation-Check
Mesure de la mémoire pour les applications Java utilisant jstat
Utilisation de Java avec AWS Lambda-Implementation-Stop / Launch EC2
Injection de dépendances Spring à l'aide de Java, Kotlin
Formation des nouveaux arrivants à l'aide de la programmation Web-Basic à l'aide de Java-
Essayez d'utiliser l'API Stream en Java
Utilisation de JupyterLab + Java avec WSL sous Windows 10
Mapper sans utiliser de tableau en java
Remarques sur les opérateurs utilisant Java ~ Type chaîne ~
[Java] Envoyer un e-mail à l'aide d'Amazon SES
[Java + jsoup] Scraping des produits Mercari à vendre
Étude de Java Essayez d'utiliser un scanner ou une carte
Filtre Sobel utilisant OpenCV sur Android (Java)