<dependency> <!-- jsoup HTML parser library @ [url]http://jsoup.org/[/url] --> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version> </dependency>XYZ.com Sitesi Sahibinden.com ile değiştirilecek. Notepad++ ile replace edebilirsiniz. Ve kocaeli olan kısımlar Ankara olarak değiştirilecek yine replace ile yapabilirsiniz.
import java.text.SimpleDateFormat;
import java.util.Date;
public class XYZ{
private String sahip;
private String mKare;
private String fiyat;
private Date ilanTarihi;
private String ilçe;
private String tamYer;
private int weight;
public XYZ(String sahip, String mKare, String fiyat, Date ilanTarihi, String ilçe, String tamYer) {
super();
this.sahip=sahip;
this.mKare = mKare;
this.fiyat = fiyat;
this.ilanTarihi = ilanTarihi;
this.ilçe = ilçe;
this.tamYer=tamYer;
}
public String getmKare() {
return mKare;
}
public void setmKare(String mKare) {
this.mKare = mKare;
}
public String getFiyat() {
return fiyat;
}
public void setFiyat(String fiyat) {
this.fiyat = fiyat;
}
public Date getIlanTarihi() {
return ilanTarihi;
}
public void setIlanTarihi(Date ilanTarihi) {
this.ilanTarihi = ilanTarihi;
}
public String getIlçe() {
return ilçe;
}
public void setIlçe(String ilçe) {
this.ilçe = ilçe;
}
public String getSahip() {
return sahip;
}
public void setSahip(String sahip) {
this.sahip = sahip;
}
public String getTamYer() {
return tamYer;
}
public void setTamYer(String tamYer) {
this.tamYer = tamYer;
}
@Override
public String toString() {
return "XYZ [Sahibi= "+sahip+" mKare=" + mKare + ", fiyat=" + fiyat + ",
ilanTarihi=" + ilanTarihi.toLocaleString()
+ ", ilçe=" + ilçe + "]";
}
public int getDayThrough(){
SimpleDateFormat format= new SimpleDateFormat("dd.MM.yyyy");
Date now=new Date();
long d1=now.getTime();
long d2=ilanTarihi.getTime();
return (int)Math.abs((d1-d2)/(1000*60*60*24));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((sahip == null) ? 0 : sahip.hashCode());
result = prime * result + ((tamYer == null) ? 0 : tamYer.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
XYZ other = (XYZ) obj;
if (sahip == null) {
if (other.sahip != null)
return false;
} else if (!sahip.equals(other.sahip))
return false;
if (tamYer == null) {
if (other.tamYer != null)
return false;
} else if (!tamYer.equals(other.tamYer))
return false;
return true;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}Önemli Kısım:import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import domain.XYZ;
public class main {
private static int say=0;
public static void main(String[] args) {
File saveFilePath=new File("D:/result.csv");
ArrayList sahip=new ArrayList<>();
ArrayList sahipWeight=new ArrayList<>();
/*
*Verilen url isimli string parse edilecek adresi
*gösteriyor. Arama parametreleri ise;
*pagingSize gösterilen sayfadaki ilan adetini gösteriyor.
*pagingOffset ise hangi sayfada olduğunuzu gösteriyor.
*/
String url="https://www.XYZ.com/satilik-arsa/kocaeli?pagingOffset=50&amp;amp;pagingSize=50";
try {
for (int a=0;a<951;a=a+50){ if(a>=1)
url="https://www.XYZ.com/satilik-arsa/kocaeli?pagingOffset="+a+"&amp;amp;pagingSize=50";
Response response= (Response) Jsoup.connect(url).timeout(300000).execute();
//Bağlantı sağlanıp döküman parse ediliyor.
Document doc=response.parse();
// a[class='classifiedTitle'] ile DOM elemanı seçilip ilgilideğeri alınıyor.
//Diğer verilerde bu mantıkla yazılmıştır.
Elements detays=doc.select("a[class='classifiedTitle']");
Elements ids=doc.select("tr.searchResultsItem");
Elements mkares=doc.select("td.searchResultsAttributeValue");
Elements fiyat=doc.select("td.searchResultsPriceValue");
Elements dates=doc.select("td.searchResultsDateValue");
Elements locations=doc.select("td.searchResultsLocationValue");
//Herbir ilanın içine girilerek arsanın tam konumu ve ilan sahibinin verileri alınıyor.
for(int i=0;i<dates.size();i++){ String urlDetay="https://www.XYZ.com"+detays.get(i).attr("href"); Response responseDetay= (Response) Jsoup.connect(urlDetay).timeout(300000).execute(); Document docDetay=responseDetay.parse(); Elements sahips=docDetay.select("div[class='username-info-area']"); Elements tamYers=docDetay.select("h2 a"); sahip.add(new XYZ(sahips.get(0).text(), mkares.get(i).text(), fiyat.get(i).text(), fixDate(dates.get(i).text()), locations.get(i).text(), tamYers.get(2).text()) ); } } BufferedWriter writer = new BufferedWriter(new FileWriter(saveFilePath.getAbsolutePath())); writer.write("locations,owner,weightn"); for (XYZ element : sahip) { sahip.stream().forEach( k->{
if(element.equals(k)){
say++;
}
});;
element.setWeight(say);
if(!sahipWeight.contains(element))
sahipWeight.add(element);
say=0;
}
//Tüm veriler alındıktan sonra yazma işlemine geçiliyor.
for (XYZ element : sahipWeight) {
//writer.write(element.getIlçe()+","+element.getSahip()+","+element.getDayThrough()+"n");
writer.write(element.getTamYer()+","+element.getSahip()+","+element.getWeight()+"n");
System.out.println(element.toString());
}
writer.flush();
writer.close();
} catch (IOException | ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Ayı rakam olarak ifade edebilmek için bir metot.
private static Date fixDate(String date) throws ParseException{
String[] parseDate=date.split(" ");
String mounth="";
SimpleDateFormat format= new SimpleDateFormat("dd.M.yyyy");
switch (parseDate[1]) {
case "Ocak":
mounth="01";
break;
case "Şubat":
mounth="02";
break;
case "Mart":
mounth="03";
break;
case "Nisan":
mounth="04";
break;
case "Mayıs":
mounth="05";
break;
case "Haziran":
mounth="06";
break;
case "Temmuz":
mounth="07";
break;
case "Ağustos":
mounth="08";
break;
case "Eylül":
mounth="09";
break;
case "Ekim":
mounth="10";
break;
case "Kasım":
mounth="11";
break;
case "Aralık":
mounth="12";
break;
default:
break;
}
return format.parse(parseDate[0]+"."+mounth+"."+parseDate[2]);
}
}Sorun: Bu veriler hesaplanıyor ancak en son programın çıktısı olan Result.csv dosyasına yazılmıyor. Bunun en büyük sebebi ise ilk başta tam olarak modeli oturtamamdan kaynaklanıyor. Aslında csv dosyasında analizde kullanılan kümeler kocaeli bölgesindeki arsa isimleri, ilan sahiplerinin isimleri ve ilan sahipleri aynı bölgeden kaç kez ilan verdiğidir.Bu Jsoup hakkında yazdıklarıma ek olarak, hangi DOM elemanını nasıl bulunacağına dair kafanızda soru işaretleri varsa Jsoup sitesindeki Try Jsoup butonuna tıklayarak hangi DOM elemanını seçmeniz gerektiği konusunda sizi yönlendirecektir. (Buradan ulaşabilirsiniz.)