Klicken Sie hier für den vorherigen Artikel (https://qiita.com/suisen/items/a856c06accdab922153c)
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)
① 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.
① Erhalten von Ergebnisinformationen wie Pferderennen von netKeiba (http://www.netkeiba.com/) (2) Export in eine CSV-Datei, die mit Excel usw. verwendet werden kann.
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. Ich weiß, dass es zu lange dauert.
Seit dem letzten Code wurden nicht viele hinzugefügt.
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.
//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.
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();
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.
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