728x90
반응형
보통 파이썬을 사용하여 웹크롤링을 만드는데 이번에 자바를 이용하여 웹크롤링을 만들어보려 한다.
필요한 파일은 총 2개
httpcore
httpcomponents-core-4.4.6-src.zip
httpclient
httpcomponents-client-4.5.3-src.zip
로 웹크롤링을 만들어보자 이 두개 파일을 해당 프로젝트에 Build Path 한 후 pom.xml에
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
반응형
'개발 > java' 카테고리의 다른 글
java 랜덤 한글생성 (0) | 2017.05.30 |
---|---|
자바 웹크롤링수정 (0) | 2017.05.18 |
자바의 여러가지 개념을 정리한것 (1) | 2015.12.13 |
이클립스 svn 설치 (0) | 2015.12.07 |
JAVA 돌아라..돌아라..for문/반복문(두뇌 풀가동! 구구단) (0) | 2015.10.23 |
댓글