응용프로그램2015. 6. 3. 00:04

*2016-1-21 추가: 이 글의 방법은 안 통합니다. AWS API를 이용하는 방법밖에 없습니다. 다음 글 등을 참고.

https://ctrlq.org/code/19965-amazon-api-with-google-script



스크립트 없이 구글 스프레드시트 importxml 함수만 이용해서 아마존 상품페이지의 각종 정보를 불러오는 방법임. 현재까지 국내외에 알려진 방법은 더는 통하지 않는다. 아마존이 페이지를 계속 바꾸고 내용을 동적으로 만들기 때문이 아닐까 추측.


알다시피 아마존 상품페이지는 다음과 같이 생겼고, 우리내가 원하는 정보는 빨간 부분, 그리고 저자 및 정가다.


http://www.amazon.com/The-Witcher-Collectors-Edition-Official/dp/0804162980/http://www.amazon.com/The-Witcher-Collectors-Edition-Official/dp/0804162980/


파폭 wdt 확장기능에서 보면 저곳의 dom 경로는 html>body#dp>div#a-page>div>div#detail-bullets이다. 크롬에서는 중간이 약간 다른데, 어쨌든 저기서 우클릭>Copy XPath 하면 //*[@id="detail-bullets"]라고 나올 거다.


크롬 개발자 도구크롬 개발자 도구


그럼 이 XPath 쿼리를 바로 importxml에 넣으면 되겠네? 야 신난다~ 싶겠지만... 처음부터 말했듯 안 된다는 게 문제다. 되면 내가 이걸 쓰고 있지도 않겠지...


importxml 실험-_-importxml 실험-_-


실험 결과, 위 dom 경로에 있는 div 중 importxml로 불러오는 게 가능한 건 최상위 div인 a-page뿐이었다. 직접 보면 알겠지만, 원하지 않는 정보와 엄청난 스크립트 들로 가득 차 있다. 위 페이지의 경우 len 해보니 375,299 글자가 나온다(...). 따라서 a-page에서 원하는 정보를 텍스트로 파싱해야 한다는 거... 절망적이다.


위안이 되는 점도 하나 있다. 메타 태그에 위 정보 중 일부가 들어 있고, 메타 태그는 importxml 함수가 잘 먹힌다.


메타 태그메타 태그


보다시피 저자, 도서명, 부제, ISBN, 분야 정보가 들어 있다. 항목들이 콜론과 스페이스(: )로 잘 구분된 title 태그를 importxml한 다음 split하면 된다.


다만, 이것조차 한계가 있다. 책마다 title 태그에 들어가는 항목이 다르다. -_- 이 책은 부제가 두 개인데, 어떤 책은 부제가 없다. 또 아마존의 서지정보 미흡으로 저자가 들어 있지 않은 경우도 있다. 즉 split을 일관되게 할 수가 없다. 어쩌라고!


게다가 나머지 정보, 즉 출판사, 출간일, 정가, 랭크도 메타 태그에는 없다. 얘네는 결국 a-page를 파싱해야 한다는 거...


메타 태그 및 나머지 정보를 무식하게 파싱하는 예제는 다음과 같다. 랭크 및 분야는 빠져 있다. 나중에 추가할지도.


https://docs.google.com/spreadsheets/d/1GEufB9BxulYIYwOGKZXhAFbC6-aTRmS1uUeDBN-M-fE/ (새창, 웹에 공개)


사용법: I열에 URL을 넣으면 해당 URL의 아마존 문서에서 도서명, 출판사, 출간일, 정가, ISBN을 가져와 B~H를 채운다.


B~H열에도 지저분한 수식이 들어 있지만, J열부터는 한층 지저분한 수식과 그나마 수식을 덜 복잡하게 하려고 넣은 문자열들을 볼 수 있다. 수식에 대한 설명은... 도저히 쓸 엄두가 안 남.


참고로, 일본 아마존 문서는 아마존닷컴과는 또 다르다. div들의 id나 class는 같지만 메타 태그 구분자도 다르고, importxml 결과도 다르다(어째서!? 심지어 가끔씩 내부 오류도 난다). 회사 파일에는 일본 아마존 정보 가져오는 수식을 따로 넣었는데, 정말 거지 같다.


미괄식으로 급 정리.

  1. 구글 스프레드시트에는 웹 문서 정보를 긁어오는 importxml이라는 멋진 함수가 있다.
  2. 근데 아마존 문서(본문)만은 제대로 긁어오지 못한다. WTF!
  3. 그래서 일부 정보는 메타 태그에서 가져오고, 나머지 정보는 무식하게 파싱해야 한다.
  4. 무식하게 파싱하는 방법은 위 구글 스프레드시트를 참고.


***수정: R, S열은 셀 높이가 커 스크롤이 불편해지므로 숨겨놨다. 구글 계정이 있는 사람은 '파일>사본 만들기'로 자기 사본을 만들면 해당 열을 볼 수 있다. 친절하게 수식을 직접 적자면, R2는 =importxml(I2,O2), S2는 =regexreplace(regexreplace(R2,"<.*?>",""),"\s{2,99}"," ")이다(정규표현식 좀 예쁘게 만들어줄 사람 없나?).




Posted by 필유