본문 바로가기

Java

이클립스(eclipse)에서 웹 크롤링

윤리

어떤 웹 사이트는 크롤링을 하면 안된다. 특정 시간 내에 너무 많은 크롤링을 하면 해당 사이트에서 접속을 차단할 수도 있다. 좋은 목적으로 써야함(해커 입장이 아닌...), 


웹 크롤링을 활용해서 돈 벌기 : http://www.entropywebscraping.com/2017/01/01/big-list-web-scraping-uses/

함정은 단순히 크롤링을 해서 돈을 자동으로 벌지는 못한다는 점이다. 명확한 목표가 있어야하고 이런 저런 데이터를 긁어 모은 뒤 돈이 되게 해주는 데이터 과학자 등의 고급 인력이 필요할 수도 있다...


jsoup

HTML 기반의 내용물에 쓰이는 자바 기반의 라이브러리다.

데이터를 추출하고 다룰 수 있도록 매우 편리한 API를 제공한다.

기능 : CSS selector, DOM 다루기, 유효하지 않은 데이터 다루기.

DOM은 document object model의 약자다. HTML, XML을 처리하는 API다. 문서의 구조화를 해줘서 태그의 부모 자식 관계를 만들어준다.


jsoup 설치

https://jsoup.org/ 에 접속해서 download 탭을 클릭하고 jsoup-x.xx.x.jar core library를 다운로드한다.


이클립스에서 환경 설정

이클립스 켠다. 없다면 설치...


File->New->Java Project->project 이름 설정하고 프로젝트 생성.


해당 프로젝트에 마우스 커서 갖다 놓고 우클릭. Properties 클릭


노랗게 표시한 것 처럼 Java Build Path 클릭 -> Add External JARs 클릭 -> 아까 다운로드 한 jsoup.jar 파일 클릭.


프로젝트에 마우스 커서 갖다놓고 우클릭 -> New -> Class 클릭 해서 java 파일 생성


다음은 코드 설명


crawler.java 파일


package crawler;


import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;


public class crawler {

public static void main(String[] args) {

// TODO Auto-generated method stub

String html="<html><head><title>Sample Title</title></head>"

+"<body><p>Sample Content</p></body></html>";

Document document = Jsoup.parse(html); //html이라는 문자열을 해석

System.out.println("==========<head>==========\n"+document.head());//head 태그 포함해서 출력

System.out.println("==========<body>==========\n"+document.body());//body 태그 포함해서 출력

System.out.println("==========<title>==========\n"+document.title());//title 태그 안의 내용물 출력, 왜 title 태그는 안나오지?

System.out.println("==========<body>==========\n"+document.getElementsByTag("body"));//body태그를 포함한 모든 태그와 내용물 출력

Elements paragraphs = document.getElementsByTag("p");

for(Element paragraph : paragraphs){

System.out.println("==========<p>==========\n"+paragraph.text());//태그를 제외한 태그 안의 내용물만 출력

}

}


}


dommethod.java 파일

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

public class dommethod {

public static void main(String[] args) {
// TODO Auto-generated method stub
String html="<html><head><title>Sample Title</title></head>"
+"<body>"
+"<p>Sample Content</p>"
+"<p>Another p tag</p>"
+"<div id='sampleDiv'><a href='www.google.com'>Google</a></div>"
+"</body></html>";
Document document = Jsoup.parse(html);
System.out.println("==========<title>==========\n"+document.title());
Elements paragraphs = document.getElementsByTag("p");
for(Element paragraph : paragraphs) {
System.out.println("==========<p>==========\n"+paragraph.text());
}
Element sampleDiv = document.getElementById("sampleDiv");
System.out.println("==========<sampleDiv>==========\n"+sampleDiv.text());
//id가 sampleDiv인 a태그에 있는 요소들을 links에 넣음.
Elements links = sampleDiv.getElementsByTag("a");
//각 요소를 link라고 함.
for(Element link : links) {
System.out.println("Href : "+link.attr("href"));//해당 요소에 있는 속성이 href인 것의 내용 출력
System.out.println("Text : "+link.text());//해당 요소에 있는 내용물 출력
}
}

}

address_price.java 파일

package crawler;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class finderror {
   public static void main(String[] args) throws IOException{
      
      String url = "https://www.zillow.com/homes/for_sale/Denver-CO/pmf,pf_pt/118576962_zpid/11093_rid/globalrelevanceex_sort/39.976331,-104.6101,39.554089,-105.104485_rect/10_zm/";
      //String url = "https://www.zillow.com/homes/for_sale/pmf,pf_pt/globalrelevanceex_sort/39.78473,-104.864244,39.701045,-104.974108_rect/12_zm/";

      Document document = Jsoup.connect(url).get(); //url(uniform resource locator)에 가서 파싱한 내용을 document에.

      Elements addr = document.getElementsByClass("zsg-photo-card-address");//파싱 내용 중 class가 zsg-photo-card-address인 것을 addr에.
      Elements price = document.getElementsByClass("zsg-photo-card-price");

      for(int i =0; i < price.size(); i++){ //찾아낸 요소의 갯수만큼 반복
         System.out.println(addr.get(i).text()+":"+price.get(i).text());//각 클래스의 내용물 출력
      }
   }
}

address_price2.java 파일

package crawler;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import java.io.IOException;


public class selectandattr {


public static void main(String[] args)throws IOException {

//주택의 주소와 가격 뽑기

String url="https://www.zillow.com/homes/for_sale/Denver-CO/pmf,pf_pt/118576962_zpid/11093_rid/globalrelevanceex_sort/39.976331,-104.6101,39.554089,-105.104485_rect/10_zm/";

Document document = Jsoup.connect(url).get();//url 해석하기

Elements parents = document.getElementsByClass("zsg-photo-card-spec");//원하는 내용의 부모 클래스


for(Element paragraph: parents) { //부모 클래스 안에 있는 address, price 클래스 출력

System.out.println(paragraph.getElementsByClass("zsg-photo-card-address").text()+ ' '+paragraph.getElementsByClass("zsg-photo-card-price").text());

}

}

}


loadingurl.java 파일

package crawler;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class loadingurl {

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String html = "<div><p>Sample Content</p>";
Document document = Jsoup.parseBodyFragment(html);//입력된 html을 파싱함
Element body = document.body(); //document.getElementById("body")와 동일
Elements paragraphs = body.getElementsByTag("p");//태그가 p인거 다 가져옴
for(Element paragraph : paragraphs) { //각 p태그 안에 있는 내용물 출력
System.out.println(paragraph.text());
}
String url="http://www.google.com"; //google.com 주소
Document document1 = Jsoup.connect(url).get(); //주소에 가서 html 해석한다.
Elements contents = document1.getElementsByClass("gb_O"); //뽑고자 하는 내용물의 부모 클래스를 찾는다.
System.out.println(document1.title()); //내용 중에 태그가 title인 것 출력
for(Element content : contents) {
System.out.println(content.getElementsByTag("span").text()); //내용 중 태그가 span인 것 출력
}
}

}

navernews.java 파일


package crawler;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import java.io.IOException;

import org.jsoup.nodes.*;

import org.jsoup.select.Elements;

public class navernews {


public static void main(String[] args)throws IOException {

String url="http://news.naver.com/";

Document document = Jsoup.connect(url).get(); //네이버 뉴스 url 해석.

//이 시각 주요 뉴스의 헤드라인 뽑기

Elements strong = document.getElementsByClass("newsnow_tx_inner"); //뽑고자 하는 내용의 부모 class.

for(Element st : strong) {

System.out.println(st.getElementsByTag("strong").text());//부모 클래스 안에 있는 strong 태그의 내용물

//System.out.println(st.getElementsByTag("a").text());

}

}

}



'Java' 카테고리의 다른 글

자바 jdk 설치 및 환경 변수 설정  (0) 2018.06.21
이클립스(eclipse)에서 웹 크롤링 with MongoDB  (0) 2018.05.16