# ajax 페이지 크롤링하기 ## 질문 jsoup으로 페이지를 크롤링하고 있습니다. 그런데 ajax로 페이지가 불러와진 경우 크롤링이 되지 않아서요. 어떻게 하죠? ## 개발환경 + Java + JSP + SpringMVC + Jsoup(크롤러)
# 자답 ajax 요청을 분석하여 jsoup으로 ajax요청 결과를 받아와 처리합니다. ## 동작 코드 ``` String url = "http://search.example.com/api/search/deals?keywoard=abc"; Document doc = Jsoup.connect(url) .header("origin", "http://search.example.com") // same-origin-polycy 로 인한 설정 .header("referer", "http://search.example.com") // same-origin-polycy 로 인한 설정 .ignoreContentType(true) // json 받아오려면 타입무시를 해야하는듯? .get(); String json = doc.select("body").text(); ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(json); // json을 node로 변환하여 traversing을 편하게. // prices("dealAmount") List<JsonNode> priceList = node.findValues("dealAmount"); System.out.printf("prices(%d): ", priceList.size()); for (JsonNode price : priceList) { System.out.printf("%s, ", price); } System.out.println(); // url("dealDetailUrl") List<JsonNode> urlList = node.findValues("dealDetailUrl"); System.out.printf("urls(%d): ", urlList.size()); for (JsonNode detailUrl : urlList) { System.out.printf("%s, ", detailUrl); } System.out.println(); ``` ## 동작 예 ``` prices(24): 2500, 3000, 17500, 5000, 10800, 6300, 24000, 14900, 11900, 2900, 8000, 19800, 10800, 5400, 139000, 3900, 18000, 1450, 11800, 7690, 12000, 33900, 7600, 3500, urls(24): "http://test.com/deal/728951054?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/878613934?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1110150834?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/373598494?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1129115762?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1434766770?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/901875850?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/758750730?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1324160606?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1115440706?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1365327550?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1049923402?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1140786246?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1435576618?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1000372678?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/618512266?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/780972526?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/644813074?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/627772030?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1431052442?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1414066846?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/870760058?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/789785474?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", "http://test.com/deal/1431006386?keyword=%ED%94%BC%EA%B7%9C%EC%96%B4", ``` ## 설명 크롬 개발자 도구를 통해 ajax 요청을 분석하여 요청 url을 추출. (참고: 레퍼런스 3) jsoup 연결시 header 정보에 origin, referer 정보를 수정한다. (참고: 레퍼런스 1) ``` .header("origin", "something.com") // same-origin-polycy 로 인한 설정 .header("referer", "something.com") // same-origin-polycy 로 인한 설정 ``` 마지막으로 콘텐츠 타입설정을 한다. ``` .ignoreContentType(true) // json 받아오려면 타입무시를 해야하는듯? ``` ## 레퍼런스 1. javascript ajax 크로스 도메인 요청하기 (http://adrenal.tistory.com/16) 2. JQUERY의 JSONP을 사용한 크로스도메인간 통신 (http://www.codejs.co.kr/jquery-jsonp/) 3. Java HTML parser, Jsoup로 원하는 값 얻어내기 - Ajax (http://partnerjun.tistory.com/51) 4. Jsoup로 JSON 데이터 받아오기 (http://m.blog.naver.com/lovej804/220619290290) 5. Extract attributes, text, and HTML from elements (https://jsoup.org/cookbook/extracting-data/attributes-text-html) 6. Jackson을 이용한 Java JSON 파싱 (http://derveljunit.tistory.com/215) 7. Traversing JSON trees with Jackson (http://www.cowtowncoder.com/blog/archives/2011/08/entry_460.html)