본문 바로가기
개발/java

java 웹크롤링

by 카앙구운 2017. 5. 11.
728x90
반응형

보통 파이썬을 사용하여 웹크롤링을 만드는데 이번에 자바를 이용하여 웹크롤링을 만들어보려 한다. 

 필요한 파일은 총 2개 

 httpcore  

httpcomponents-core-4.4.6-src.zip


httpclient

httpcomponents-client-4.5.3-src.zip


로 웹크롤링을 만들어보자 이 두개 파일을 해당 프로젝트에 Build Path 한 후 pom.xml에

org.apache.httpcomponents httpclient 4.5.3 org.apache.httpcomponents httpcore 4.4.6 이런식의 추가가 필요하다.
public class WebCrawling {
public static void main(String[] args) throws ClientProtocolException, IOException {
		//스케줄을 이용하여 1분마다 긁어온다.
		ScheduledJob job = new ScheduledJob();
		Timer jobScheduler = new Timer();
		jobScheduler.scheduleAtFixedRate(job, 1000, 60000);
		try {
			Thread.sleep(400000);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		jobScheduler.cancel();

		System.out.println("End Date:"+getCurrentData());
	
		
	}
}
class ScheduledJob  extends TimerTask {
	public static String getCurrentData(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
		return sdf.format(new Date());
	}
	public void run(){
	
		//1. 가져오기전 시간찍기
		System.out.println("Start Date : "+ getCurrentData());
		
		
		//2.가져올 http 주소 셋팅
		//http://www.todayhumor.co.kr/board/view.php?table=bestofbest&no="+no+"&s_no="+s_no+"&page=1
		HttpPost httpBob = new HttpPost("http://www.todayhumor.co.kr/board/list.php?table=bestofbest");
		HttpClient httpClientBob = HttpClientBuilder.create().build();
		HttpResponse responseBob = null;
		try {
			responseBob = httpClientBob.execute(httpBob);
		} catch (ClientProtocolException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		HttpEntity entityBob = responseBob.getEntity();
		ContentType contentTypeBob= ContentType.getOrDefault(entityBob);
		BufferedReader brBob = null;
		try {
			brBob = new BufferedReader(new InputStreamReader(entityBob.getContent()));
		} catch (UnsupportedOperationException | IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		StringBuffer sbBob = new StringBuffer();
		String lineBob="";
		try {
			while((lineBob=brBob.readLine())!=null){
				sbBob.append(lineBob + "\n");
			}
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		String sBob=sbBob.toString();
		String s2Bob = sBob.substring(sBob.indexOf("bestofbest&no")+14,sBob.indexOf("bestofbest&no")+20);
		int no = Integer.parseInt(s2Bob);
		int s_no = Integer.parseInt(s2Bob);
		
		for (int i = 20; i >0 ; i--) {
			no=no-1;
			s_no=s_no-1;
			System.out.println("no:"+no);
			HttpPost http = new HttpPost("http://www.todayhumor.co.kr/board/view.php?table=bestofbest&no="+no+"&s_no="+s_no+"&page=1");
			//3.가져오기를 실행할 클라이언트 객체 생성
			HttpClient httpClient = HttpClientBuilder.create().build();
			//4.실행 및 실행 데이터를 Response 객체에 담음
			HttpResponse response = null;
			try {
				response = httpClient.execute(http);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//5.Response 받은 데이터 중 , DOM 데이터를 가져와 Entity에 담음
			HttpEntity entity = response.getEntity();
			//6.Charset을 알아내기 위해 DOM의 컨텐트 타입을 가져와 담고 Charset을 가져옴
			ContentType contentType= ContentType.getOrDefault(entity);
			Charset charset= contentType.getCharset();
			//7.DOM 데이터를 한 줄씩 읽기위해 Reader에 담음(InputStream/Buffered 중 선택은 개인취향)
			BufferedReader br = null;
			try {
				br = new BufferedReader(new InputStreamReader(entity.getContent()));
			} catch (UnsupportedOperationException | IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//8.가져온 DOM데이터를 담기위한 그릇
			StringBuffer sb = new StringBuffer();
			//9.DOM데이터 가지고 오기
			String line="";
			try {
				while((line=br.readLine())!=null){
					sb.append(line + "\n");
				}
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			//10.가져온 아름다운 DOM을 보자
			//System.out.println(sb.toString());
			
			try {
				BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
				String s= sb.toString();
				
				out.write(s);
				out.newLine();
				out.close();
			} catch (IOException e) {
				System.err.println(e);
				System.exit(1);
			}
			
			String s22=sb.toString();
			String s2="";
			String s3="";
			try {
				s2 =s22.substring(s22.indexOf("http://thimg.todayhumor.co.kr/upfile"),s22.indexOf("http://thimg.todayhumor.co.kr/upfile")+200);
				if(s2.indexOf(".png")>-1){
					s3 = s2.substring(s2.indexOf("http://thimg.todayhumor.co.kr/upfile"),s2.indexOf(".png"))+".png";
				}else if(s2.indexOf(".jpg")>-1){
					s3 = s2.substring(s2.indexOf("http://thimg.todayhumor.co.kr/upfile"),s2.indexOf(".jpg"))+".jpg";
				}
			} catch (Exception e) {
				System.out.println("이미지가 없음");
			}
			
			
			try {
				//String imgUrl="http://thimg.todayhumor.co.kr/upfile/201705/1494399838fa07198aa28147d48d8b5b7e62fea3c3__mn626423__w1080__h1440__f91058__Ym201705.png";
				String imgUrl=s3;
				URL url = new URL(imgUrl);
				String fileName= imgUrl.substring(imgUrl.lastIndexOf('/')+1,imgUrl.length());
				String ext=imgUrl.substring(imgUrl.lastIndexOf('.')+1,imgUrl.length());
				BufferedImage img= ImageIO.read(url);
				 
				ImageIO.write(img, ext, new File("C://"+fileName));
			} catch (Exception e) {
				System.out.println("이미지가 없습니다.");
			}
		}
		
	}
}

나 같은 경우 오늘의 유머의 베스트 오브 베스트의 1페이의 첫번째 사진들을 저장하는 코드를 짰다. 

728x90
반응형

댓글