Schrottpraxis mit Java ②

Klicken Sie hier für den vorherigen Artikel (https://qiita.com/suisen/items/a856c06accdab922153c)

Scraping mit Java ②

Referenz / Site Java eine kleine Referenz (https://java-reference.com/java_string_tonumber.html) Mr. TECH PROJIN (https://tech.pjin.jp/blog/2017/10/17/ [Java] CSV-Ausgabebeispielcode /) Herr Samurai Yamashita (https://www.sejuku.net/blog/20746) Lassen Sie uns programmieren (https://www.javadrive.jp/start/stream/index6.html)

Letzte Überprüfung

① Ich wollte kratzen. (2) Ich habe jsoup.jar heruntergeladen und eingestellt und einen Beispielcode erstellt. (3) Es wurde bestätigt, dass Zeichen aus der Tag-Spezifikation auf Yahoo! und anderen Websites extrahiert werden können.

Was ich diesmal machen möchte

① Erhalten von Ergebnisinformationen wie Pferderennen von netKeiba (http://www.netkeiba.com/) (2) Export in eine CSV-Datei, die mit Excel usw. verwendet werden kann.

Hauptgeschichte

Also habe ich es tatsächlich zusammengebaut. Ich bin noch unreif, daher ist mir Zeit und Effizienz egal. Ich denke, es ist sinnvoll, es vorerst zu erwerben. Achten Sie auch darauf, es nicht zu übertreiben, da Sie oft hören, dass das Schaben die andere Partei belastet.

Zunächst aus dem Code (ich denke, ich muss ihn ursprünglich klassifizieren, aber da es sich um ein Beispiel handelt, werde ich ihn zusammenstellen)

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 {

	/**
	 *Vorbereitung für den Export im CSV-Format ⇒ URL angeben ⇒ Web-Scraping mit jsoup ⇒ Als Java-Beans auflisten
	 *⇒ Schreiben Sie die Liste im CSV-Format. ⇒ Ausnahmebehandlung mit catch-Anweisung. ⇒ Flow schließen
	 */
	public static void main(String[] args) {

		//Zur Messung der Ausführungszeit
		long start = System.currentTimeMillis();

		//Initialisierung des CSV-Exports
		BufferedWriter bw=null;


		//try-Brauchen Fang Anweisung
		try {
			//Beschreiben Sie den Namen der Exportzieldatei in der ersten Spalte
			bw=new BufferedWriter(new FileWriter("D:\\sakura\\ScrapingHtml\\scraping.csv", true));
			bw.write("Pferdename,Datum,Gehaltenen,Wetter,Name des Rennens,Pferdenummer,Beliebt,Reihenfolge der Ankunft,Reiter,Entfernung,Status,Zeit");
			bw.newLine();

			//Ersetzen Sie den letzten Satz der URL durch eine Zahl.
			for(int j = 2015100001; j<=2015100010; j++) {

				//Generieren Sie eine Liste, die in TestBeans gespeichert werden soll, die separat erstellt wurden
				List<TestBeans> list = new ArrayList<TestBeans>();

				//Document A = Jsoup.connect("url").get();Scraping Ziel auf URL
				Document doc = Jsoup.connect("http://db.netkeiba.com/horse/"+j).get();

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

				//Vorbereitung zur Anzeige des Pferdenamens
				//Nehmen Sie die Anzahl der Zeichen grob und schneiden Sie sie ab, wenn von dort ein Leerzeichen vorhanden ist.
				String tstr = title.text().substring(0, 10);
				int i = tstr.indexOf(" ");

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

				//Initialisieren Sie die Zeichenfolge zur Verwendung unten
				String str=null;
				//Speichern Sie Elemente in TestBeans mit erweiterter for-Anweisung
				for(Element a : elm) {
					str = a.text();
					//Ich möchte den Ausschluss, die Absage und die Absage des Rennens ausschließen.
					if(str.indexOf("Ausschluss")!=-1 || str.indexOf("Tori")!=-1 ||str.indexOf("Während ~")!=-1) {
						continue;
					}
					//Ich möchte nur Renninformationen, aber ich konnte sie nicht eingrenzen, indem ich nur die obigen Tags spezifizierte, also entschied ich mich für die Anzahl der Zeichen.
					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]);

						//In Liste speichern
						list.add(bean);
					}
				}

				//Export in eine CSV-Datei mit der erweiterten for-Anweisung. Zum besseren Verständnis durch Kommas getrennt
				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();
				}
			}
			//enge Verarbeitung.
			bw.close();
			System.out.println("Erledigt");

		//Ausnahmebehandlung
		}catch(IOException e) {
			e.printStackTrace();
		}catch(NumberFormatException e) {
			e.printStackTrace();

		//Stellen Sie für alle Fälle sicher, dass Sie es mit einer abschließenden Erklärung schließen. Ich bin mir nicht sicher, ob es benötigt wird.
		}finally {
			try {
				if(bw!=null) {
					bw.close();
				}
			}catch(IOException e) {
				e.printStackTrace();
			}
		}

		//Zur Messung der Ausführungszeit
		long end = System.currentTimeMillis();
		System.out.println((end - start)  + "ms");
		System.out.println((end-start)/1000 + "Sekunden");
	}
}

Das Ergebnis wird ordnungsgemäß als CSV-Datei geschrieben. 2.PNG 3.PNG Ich weiß, dass es zu lange dauert.

Ergänzende Erklärung

Seit dem letzten Code wurden nicht viele hinzugefügt.

Messung der Ausführungszeit

Erstens, nur um die Ausführungsgeschwindigkeit zu messen

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

//実行時間計測用 long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); System.out.println ((Ende-Start) / 1000 + "Sekunden");

Eingeführt. Dies ist nur eine Messung, hat also nichts mit diesem Zweck zu tun.

In das CSV-Format exportieren

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

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

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

//念のためfinally文で確実にcloseできるよう図る。必要かどうかは不明。 }finally { try { if(bw!=null) { bw.close(); } }catch(IOException e) { e.printStackTrace(); } } Exportieren Sie mit der BufferedWriter-Klasse nach außen. Es ist zweckmäßig, zuerst die Initialisierung auf Null zu setzen. Ich werde später mehr darüber schreiben, aber da ich es schließen muss, schließe ich es sofort, nachdem die große for-Anweisung endet. Ich habe der Konsole auch "Vollständig" hinzugefügt, um anzuzeigen, dass dies geschehen ist.

Außerdem ist eine Ausnahmebehandlung erforderlich, sodass diese zusammen mit IOException erfasst wird. In Bezug auf die NumberFormatException, die zusammen enthalten ist, ist dies zu diesem Zeitpunkt eine Ausnahme, da der String-Typ in den Integer-Typ konvertiert wird. Ich schließe es, aber ich war besorgt, ob ich es schaffen könnte, also schrieb ich es in die endgültige Erklärung. Es ist subtil, ob es hier notwendig ist, und es scheint einen Weg zu geben, es gut zu schreiben.

Iterative Verarbeitung der URL

Im Fall der Pferdeseite schien die diesmal verwendete Netkeiba das Ende der URL in der Reihenfolge der Zahlen einzugeben, daher sollte ich sie mit der for-Anweisung wiederholen.

			//Ersetzen Sie den letzten Satz der URL durch eine Zahl.
			for(int j = 2015100001; j<=2015100010; j++) {

				//Generieren Sie eine Liste, die in TestBeans gespeichert werden soll, die separat erstellt wurden
				List<TestBeans> list = new ArrayList<TestBeans>();

				//Document A = Jsoup.connect("url").get();Scraping Ziel auf URL
				Document doc = Jsoup.connect("http://db.netkeiba.com/horse/"+j).get();
Gegenstand

Dies ist der Hauptprozess. Es wird in der Liste der mit JavaBeans gelesenen Dinge gespeichert. Die diesmal verwendeten Java Beans sind wie folgt.

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 ist ausgezeichnet, nicht wahr? Wenn Sie den Typ und den Namen privat festlegen, werden Getter und Setter automatisch festgelegt. Vielen Dank.

Dies wird in der Liste durch die folgende Verarbeitung gespeichert.

				//Initialisieren Sie die Zeichenfolge zur Verwendung unten
				String str=null;
				//Speichern Sie Elemente in TestBeans mit erweiterter for-Anweisung
				for(Element a : elm) {   ㋐
					str = a.text();   ㋑
					//Ich möchte den Ausschluss, die Absage und die Absage des Rennens ausschließen.
					if(str.indexOf("Ausschluss")!=-1 || str.indexOf("Tori")!=-1 ||str.indexOf("Während ~")!=-1) {
						continue;
					}   ㋒
					//Ich möchte nur Renninformationen, aber ich konnte sie nicht eingrenzen, indem ich nur die obigen Tags spezifizierte, also entschied ich mich für die Anzahl der Zeichen.
					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]);  ㋔

						//In Liste speichern
						list.add(bean);  ㋕
					}
				}

Es gibt nichts Vergleichbares. ㋐ Konvertieren Sie die gelesene multiple Ulme (Elementtyp) in eine (Elementtyp), die aus kurzen Sätzen mit der erweiterten for-Anweisung besteht. ㋑ Auf str (String-Typ) setzen, der zuvor initialisiert wurde. ㋒ Wenn die Informationen, die Sie ausschließen möchten, enthalten sind, verlassen Sie weiterhin die for-Anweisung. ㋓ Da ein Satz durch Leerzeichen getrennt ist, erhalten Sie sie als Array vom Typ String. ㋔ Speichern Sie die erforderlichen Teile im Array in TestBeans mit dem TestBeans-Setter. Wechseln Sie je nach Bedarf vom String-Typ zum Integer-Typ. ㋕ Zur Liste der TestBean-Typen hinzufügen.

Mit meinen Fähigkeiten war es zu diesem Zeitpunkt nicht möglich, klüger zu schreiben.

Geht es um die Details? Jedenfalls konnte ich im CSV-Format ausgeben. Ich habe bisher nur 10 davon ausprobiert, daher würde ich gerne sehen, wie lange es mit einer etwas größeren Anzahl dauern wird.

Bitte lassen Sie uns in den Kommentaren usw. wissen, wenn Sie etwas, etwas Seltsames oder einen besseren Weg bemerken.

Nachtrag

Vielen Dank für Ihren Rat und Ihre Kommentare von saka1029. Es ist sicherlich einfacher als durch die Anzahl der Zeichen zu unterscheiden. Ich werde mich widmen.

Außerdem wurde mir klar, dass es einfacher war, den Bildschirm mit den Wettbewerbsergebnissen abzukratzen, aber ich gab vor, es nicht zu bemerken.

Recommended Posts

Schrottpraxis mit Java ②
Schrottpraxis mit Java ①
Versuchen Sie, mit Java zu kratzen [Hinweis]
Java-Übung Teil 1
Janken Spiel Java-Praxis
Ich habe versucht, ein Aktienchart mit Java (Jsoup) zu kratzen.
Versuchen Sie es mit RocksDB mit Java
Verwenden von Mapper mit Java (Spring)
Ich habe versucht, Java REPL zu verwenden
Verwenden von Docker von Java Gradle
HTML-Analyse (Scraping) mit JAVA
Machen Sie einen Diamanten mit Java
Blasensortierung mit ArrayList (JAVA)
OSX 10.15 (Catalina) Verwenden von Java mit β
Exportieren Sie ein Problem mithilfe der Java-API von JIRA
Verschlüsselung mit RSA-Verschlüsselung in Java
Laden Sie Dateien mit Java HttpURLConnection hoch
Java-Vergleich mit der compareTo () -Methode
Versuchen Sie es mit Redis mit Java (jar)
[Java] Eliminierung des Kesselplattencodes mit Lombok
Umgang mit Zeitzonen mit Java
Erstellen Sie ein Java-Projekt mit Eclipse
Java
[Trainieren! ] Mindesteinstellungen bei Verwendung von MyBatis
Unerwartete Ausnahme bei Verwendung von DateTimeFormatter in Java
Ich habe versucht, die Java8 Stream API zu verwenden
Verwenden von Java mit AWS Lambda-Eclipse-Vorbereitung
[Java] Eliminierung des Kesselplattencodes mit Lombok 2
[Java] Versuchen Sie, mithilfe von Generika zu implementieren
HTTPS-Verbindung mit tls1.2 in Java 6
Ich habe versucht, JWT in Java zu verwenden
HTML5-Entwicklung von Java mit TeaVM
So formatieren Sie Enum mit dem Formatierer-Maven-Plugin (Java)
[Trainieren! ] Java-Datenbankverknüpfung (Connector / J 8.0.20)
Versuchen Sie es mit der IBM Java-Methodenverfolgung
Java
Löschen von Dateien mit rekursiver Verarbeitung [Java]
Zusammenfassung der objektorientierten Programmierung mit Java
Beispielcode mit Minio aus Java
Verwenden des Proxy-Dienstes mit Java-Crawling
Ich habe versucht, Java Memo LocalDate zu verwenden
Versuchen Sie es mit dem Java SDK von Hyperledger Iroha
[Java] Wo haben Sie versucht, Java zu verwenden?
Ich habe versucht, Google HttpClient von Java zu verwenden
Versuchen Sie es mit dem Java Framework Nablarch [Web Application]
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Verwenden von Java mit AWS Lambda-Implementation-Check CloudWatch-Argumenten
Speichermessung für Java-Apps mit jstat
Verwenden von Java mit AWS Lambda-Implementierung-Stop / Launch EC2
Spring Dependency Injection mit Java, Kotlin
Newcomer-Training mit der Web-Basic-Programmierung mit Java-
Versuchen Sie es mit der Stream-API in Java
Verwenden von JupyterLab + Java mit WSL unter Windows 10
Map ohne Verwendung eines Arrays in Java
Hinweise zu Operatoren, die Java ~ String type ~ verwenden
[Java] Senden Sie eine E-Mail mit Amazon SES
[Java + jsoup] Scraping Mercaris Produkte zum Verkauf
Java lernen Versuchen Sie es mit einem Scanner oder einer Karte
Sobel-Filter mit OpenCV unter Android (Java)