크롤링

웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위. 크롤링(Crawling) 혹은 스크래이핑(Scraping) 이라고도 한다.



REST

엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음이다. 여기서 '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다. 간단한 의미로는, 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스를 말한다. 이 두 가지의 의미는 겹치는 부분과 충돌되는 부분이 있다. 필딩의 REST 아키텍처 형식을 따르면 HTTP나 WWW이 아닌 아주 커다란 소프트웨어 시스템을 설계하는 것도 가능하다. 또한, 리모트 프로시저 콜 대신에 간단한 XML과 HTTP 인터페이스를 이용해 설계하는 것도 가능하다.




XML이란?

트리구조의 데이터를 단순히 텍스트 형태로 나타낸 것

<?xml version="1.0"?>
<포켓몬>
<이름>피카츄</이름>
<속성>전기</속성>
<나이>3</나이>
<성별>수컷</성별>
<등록 번호>Pikachu01</등록 번호>
<소유자>사토시</소유자>
</포켓몬>

위 예시처럼 <태그> </태그> 구조로 자유롭게 만들 수 있다.

XML은 범용성 & 확장성을 가지기에 환경설정이나 데이터 전달포멧으로 쓰이는 것을 많이 볼 수 있다.

장점 : 유연하게 쓰임 (이기종간 데이터전달 등) , 네임스페이스+문서검증기능?

단점 : 가독성 쓰레기, 파싱 어려움, 처리속도 느림;; 

=> 웬만하면 json을 쓰는게 좋다.


XML파싱


DOM (Document Object Model) : 메모리에 모두 로드 후 파싱,, 빠르고 용이함.

SAX (Simple API for XML) : 순차적으로 읽어가며 파싱하는 것,, 메모리 사용량이 적음. 기능 제한 많음


책 검색 api의 url에 적절한 파라미터를 세팅해 요청을 보내고 xml형식으로 돌아오는 응답을 잘 읽어서 원하는 정보를 추출자바코드로 어떻게 url에 요청을 보내고 응답을 읽을 수 있는지 xml문서에서 원하는 값을 어떻게 획득할 수 있는지

네이버 API


프로젝트 생성

1
2
3
4
5
<dependency>
            <groupId>net.sf.sociaal</groupId>
            <artifactId>xmlpull-xpp3</artifactId>
            <version>3.0.0.20130526</version>
</dependency>
cs

1
2
3
4
5
6
7
8
9
10
11
public class Book {
    private String title;
    private String link;
    private String image;
    private String author;
    private String price;
    private String discount;
    private String publisher;
    private String pubdate;
    private String isbn;
    private String description;

 모델클래스 만들기// +게터,세터,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
 
import model.Book;
 
public class Test {
   public static void main(String[] args) throws Exception {
      // 자바코드로 특정 url에 요청보내고 응답받기
      // 기본 자바 API를 활용한 방법
      // vs
      // 외부 라이브러리를 활용한 방법
 
      String clientID = "클라이언트아이디";
      String clientSecret = "클라이언트시크릿";
      URL url = new URL("https://openapi.naver.com/v1/search/book.xml?query=" + URLEncoder.encode("책제목""UTF-8"));
 
      URLConnection urlConn = url.openConnection();
 
      urlConn.setRequestProperty("X-Naver-Client-Id", clientID);
      urlConn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
 
      BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
 
      String data = "";
      String msg = null;
      while ((msg = br.readLine()) != null) {
         // System.out.println(msg);
         data += msg;
      }
      List<Book> list = null;
      // System.out.println(data);
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      XmlPullParser parser = factory.newPullParser();
      String sTag;
      parser.setInput(new StringReader(data));
      int eventType = parser.getEventType();
      Book b = null;
      while (eventType != XmlPullParser.END_DOCUMENT) {
         switch (eventType) {
         case XmlPullParser.END_DOCUMENT:// 문서의 끝
            break;
            
         case XmlPullParser.START_DOCUMENT:
            list = new ArrayList<Book>();
            break;
            
         case XmlPullParser.END_TAG:{
             String tag = parser.getName();
             if(tag.equals("item")){
                 list.add(b);
                 b = null;
             }
         }
            
         case XmlPullParser.START_TAG: {
            String tag = parser.getName();
            switch (tag) {
            case "item":
               b = new Book();
               break;
            case "title":
                if(b != null)
                    b.setTitle(parser.nextText());
                break;
            case "link":
                if(b != null)
                    b.setLink(parser.nextText());
                break;
            case "image":
                if(b != null)
                    b.setImage(parser.nextText());
                break;
            case "author":
                if(b != null)
                    b.setAuthor(parser.nextText());
                break;
            case "price":
                if(b != null)
                    b.setPrice(parser.nextText());
                break;
            case "discount":
                if(b != null)
                    b.setDiscount(parser.nextText());
                break;
            case "publisher":
                if(b != null)
                    b.setPublisher(parser.nextText());
                break;
            case "pubdate":
                if(b != null)
                    b.setPubdate(parser.nextText());
                break;
            case "isbn":
                if(b != null)
                    b.setIsbn(parser.nextText());
                break;
            case "description":
                if(b != null)
                    b.setDescription(parser.nextText());
                break;
            }
            break;
         }
         
         }
         eventType = parser.next();
      }
      for(Book book : list)
         System.out.println(book);
   }
}
cs





http://humble.tistory.com/23 

http://fromleaf.tistory.com/150

참조 사이트


' IOT 기반 응용 SW과정 > Web Programing' 카테고리의 다른 글

Day69 API -jason  (1) 2016.06.27
Day68 네이버 API - 책검색  (0) 2016.06.24
Day66 Spring-student // 스프링 인터셉터  (0) 2016.06.22
Day65 Spring-student  (0) 2016.06.21
Day64  (0) 2016.06.20

+ Recent posts