Cliquez ici pour l'article précédent (https://qiita.com/suisen/items/a856c06accdab922153c)
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)
① 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.
① 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.
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. Je comprends que cela prend trop de temps.
Peu de choses ont été ajoutées depuis le dernier code.
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.
//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.
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();
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.
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