# ajax 페이지 크롤링하기
## 질문
jsoup으로 페이지를 크롤링하고 있습니다. 그런데 ajax로 페이지가 불러와진 경우 크롤링이 되지 않아서요. 어떻게 하죠?
## 개발환경
+ Java + JSP + SpringMVC
+ Jsoup(크롤러)
haesamq님의 답변
# 자답
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)