Extra Form
PHP PHP 7.4
CMS Rhymix 2.0

국내 포털 업체에서 사용하는 api 엔드포인트로, url을 입력하면 해당 페이지의 url은 물론 title, description, image, hostname 등을 알아낼 수 있더군요.

 

첫 시도시에는 살짝 시간이 걸리긴 하지만 캐시가 적용되는지 두 번째부터는 빠르게 크롤링해서 결과값을 뿌려줍니다.

 

근데 이게 공개된 api 같지는 않구요.

호기심에서, 정말 호기심에서 개발자도구로 뜯어보다가 알게 된 거거든요.

이걸 활용해서 자료를 만들어볼까 하는데 그러면 안 되겠죠?

도의적으로도 문제가 있을 것 같고, 언제 닫힐지 불안정하기도 하고요.

 

답은 뻔히 아는데, 코딩 노동이 고달프니 하소연을 해봅니다 흑흑.

  • profile

    그 예전에 유명 부동산 중개 사이트 2곳에서 발생한 사건이 생각나네요

    (숙소 플랫폼이였네요)

    http://economychosun.com/client/news/view.php?boardName=C05&t_num=13611638

    A사에서 B사의 백엔드 api를 무단 크롤링하여 데이터를 자사 서비스에 제공했었는데, B사에서 A사를 고소했고 A사가 수십억을 물어줬다고 들었던거 같아요 ㅎㅎ;;

    프론트에 있는 데이터를 크롤링하는건 모두에게 공개된 정보라 볼 수 있어서 법적 문제가 없는데, api를 뜯어가는건 정상적인 접근으로 얻은 정보가 아니라 법적 문제를 졌던거로 기억합니다

     

    케이스에 따라서 영업 방해도 적용 가능하겠네요

     

    위에 예시들과 말씀하시는 상황이 약간 다르긴 하지만.. 타 사이트의 api를 뜯어서 사용하는건 지양하는게 좋겠죠 ^^;;

  • profile profile
    후덜덜하네요;;; 유혹에 강한 자아를 확립해야겠어요 으으
    좋은 예시 감사합니다. 정신이 번쩍 드네요.
  • profile
    고소까지는 가지 않더라도 해당 API에 요청이 많아지면 예전 이글루스 블로그나 티스토리가 파일 외부접속을 차단했던것처럼 API도 사용제한될겁니다.
  • profile profile
    왜 이렇게 유혹 포인트들이 많은 겁니까ㅜㅜㅜㅜ
  • profile profile
    private api는 결국 막힐 가능성이 큽니다 왼만하면 오픈소스로 배포하는 경우에는 안쓰는게 맞습니다.
  • profile profile
    그쵸. 그걸 아는데도 이 놈의 손모가지가...
  • profile
    그냥 html 가져와서 메타 태그 몇 가지를 추출하는 기능이라면 직접 구현해서 쓰는 것도 어렵지 않을 것 같아요. 따로 서버를 만들 필요도 없이 AWS lambda 수준으로 커버될 듯?
  • profile profile
    네, 예전에도 하긴 했었는데..
    요즘은 빈 페이지 때려놓고 자바스크립트로 내용을 가져오는 경우들이 많잖아요. 메타 태그도 그 시점에야 생성되는 사이트들이 종종 꽤 있어서 자꾸 꼼수가 없을까 기웃거리게 됩니다ㅜ
  • profile profile

    selenium + chromedriver 같은 애들로 실제 브라우저 환경을 에뮬레이팅한 다음에 받아오는 방식으로 해결이 가능할거 같아요

    파이썬 + AWS Lambda 조합으로 api 서버 하나 판 다음에, 요청 후 1초 대기해서 메타 데이터 읽어오는 코드 짜면..?

    예전에 웹사이트 파싱용으로 람다를 써보려고 하긴 했는데, 람다가 시간이 오래 걸릴 수록 과금량이 상당해져서 크롤링용으로는 좀 부담이 되긴 하더라고요 (가끔씩 타임아웃 걸릴정도로 느린 사이트가 걸리면 대기 시간동안 계속 과금이 되어버리는 ㅎㅎ;;)

     

    +) 만약 이 아이디어 사용하시려면 크롬드라이버 옵션에 이미지 로드하지 않는 옵션 있으니 그거 적용하시는게 좋을거 같아요

  • profile profile
    찾아보니 불특정 url에 대한 동적 콘텐츠 수집은 selenium이 답인 것 같더라구요. 근데 파이썬은 제가 몰라서 .... 아무래도 야심을 줄여야 할까봐요.
    요즘은 잡는 코드마다 다 실패네요ㅜㅜ
  • profile profile
    어차피 제가 말씀드린 방법을 사용하면 과금은 필수불가결인데, 차라리 유료 API를 알아보시는것도 방법이 되겠네요

    화이팅입니다!
  • profile
    puppeteer 쓰셔도 무방합니다. ( node.js)
    가격 모니터링용도로 운영중인데 캡쳐속도 괜찮습니다. ( 순간왕창들어오는데 가끔 누락되는거 빼곤 잘됨 // 서버사양 별로 안높음 )
  • profile profile
    node.js 윽.
    어쨌든 웹호스팅 + 라이믹스 + php + javascript 만으로는 동적 페이지 스크래핑이 어렵다는 건 확실히 알 것 같습니다ㅜㅜ
  • profile profile

    웹호스팅으로는 사실상 불가능합니다.
    단독서버 환경이라면 php로도 가능은 합니다..
    https://github.com/php-webdriver/php-webdriver

     

    별도로 스크랩하는 서버를 분리하고 하는게 부하나 이런 부분떄문에 심적으로 편안합니다.

  • profile profile

    역시 취미생활자가 넘볼 수 있는 영역이 아니네요. 좌절이 심각합니다ㅜ
    대단한 데이터 크롤링도 아니고 메타태그 스크랩하는 것조차 이렇게 힘드네요.
    메타태그마저 가로막거나 동적으로 생성하는 사이트들 나빠요.

  • profile

    윤삼 님~ 안녕하세요? ^^
    Python의 Requests_HTML 모듈을 사용하면 Selenium을 직접 이용하지 않더라도
    Javascript 렌더링이 가능합니다!
    Requests_HTML이 Selenium보다 더 빠르고 간결해요~
    그리고 Python이 익숙하지 않으시더라도 Requests_HTML로 GET 요청을 하여 Javascript 렌더링을 한 후
    BeautifulSoup으로 파싱하는 작업은 간단히 하실거에요 :)
    그럼 작업 홧팅하시고 편안한 저녁 되세요! ^-^

  • profile profile
    이니스프리님, 매번 좋은 말씀 감사합니다ㅜㅜ
    말씀하신대로면 파이썬 설치가 전제돼야 하는 거죠?
    그러려면 웹호스팅 내에 파이썬을 설치하고 라이믹스 코어랑 왔다갔다 하면서 데이터를 주고 받아야 하는 건가요?
  • profile profile

    옙 일부 웹호스팅에서 Python을 지원하는 것으로 알고 있어요 ^-^
    다만 권한 등 문제로 Python 모듈 설치가 어느 정도까지 가능한지는 케바케더군요 ㅠ.ㅠ
    다른 분들 말씀처럼 API 서버를 별도로 구축하시는게 가장 확실한 방법이겠죠~
    만약 웹호스팅에서 Requests_HTML 모듈이 작동한다면 Python -> PHP로 데이터를 넘기는 것은 어렵지 않습니다!
    참고 : https://sir.kr/qa/316473
    그럼 윤삼 님께서도 편안한 밤 되세요 :)

  • profile profile
    케바케라면 결국 서버를 따로 구축하는 게 거의 유일한 방법이군요.
    웹 스크래핑 이용자들이 함께 쓸 수 있는 공용 서버 같은 게 있어도 좋겠네요ㅎㅎ
    암튼 말씀 감사합니다!!
  • profile
    메타 긁는거는 그냥 해보면 되지 않나요?
    동적렌더링하고 상관이 없을것 같아요.
  • profile profile

    주소 리다이렉트되는 건 curl로 어떻게든 추적을 해보고 있는데요.
    메타 태그까지 동적으로 생성하는 페이지도 있는 것 같더라구요.

    심지어 js로 주소를 리다이렉트를 시켜주기도 하구요;;;

    그리고 메타 태그를 아예 설정하지 않은 사이트들도 꽤 있어서 본문을 참조해야 하는 경우도 있습니다.

  • profile profile
    동적 주소 예제 있을까요? 궁금하네요.
  • profile profile

    앗, 그렇게 말씀하시니 리다이렉트 되는 걸 제대로 따라가질 못해서 그런 것 같기도 하네요ㅎㅎ
    메타 태그 생성은 순전히 추측인데요.
    제가 테스트로 시도해보다 어려움을 느꼈던 곳의 도메인들은 대강 이렇습니다.
    각자 다른 이유들에서 스크랩이 잘 안 되는 것 같더라구요.

    'cafe.naver.com', 'dict.naver.com', 'finance.naver.com', 'map.naver.com', 'place.naver.com', 'game.naver.com', 'movie.naver.com', 'jr.naver.com', 'ogqmarket.naver.com',
    'finance.daum.net', 'realestate.daum.net', 'dic.daum.net', 'wordbook.daum.net',
    'melon.com/artist', 'webtoon.kakao.com', 'makers.kakao.com',
    'kin.naver.com', 'blog.naver.com', 'grafolio.naver.com', 'cafe.daum.net', 'fmkorea.com', 'soccerline.kr',

     

    이런 주소가 대표적으로 메타 태그가 동적으로 생성(정확하게는 변경)되는 경우입니다.

    https://interior.realestate.daum.net/asp/story/View.do?lnb=23&category=&mngIdx=1718

    처음에는 title이 "Daum 부동산 인테리어"로 뜨는데, 로딩 직후에 "일상여행, 호텔처럼 꾸민 워케이션하우스 - Daum 부동산 인테리어"로 바뀌네요.

  • profile profile

    네이버 지식인의 경우는 콘텐츠를 받아서 디버깅해보니 자바스크립트로 주소를 리다이렉트시켜주는 경우이네요.

    var isPortableDevice = true;
    var realRedirectURL = \\\'\\\';
    var redirectURL = realRedirectURL == "" ? "/" : realRedirectURL;
    var mobileMappingURL = \\\'https://m.kin.naver.com/profile/index.naver?u=t2ec0D0Ry/7Ar1lsWbywVCb/wuO5E9Xtxr2QOpmxM1k=\\\';
    
    if (isPortableDevice) {
        if (realRedirectURL != "") {
            var url = realRedirectURL;
    
            // 해쉬
            var pos = realRedirectURL.indexOf("#");
            if (pos != -1) {
                  var hash = realRedirectURL.substring(pos);
                  url = realRedirectURL.substring(0, pos);
            }
    
            url += url.indexOf("?") == -1  ? "?mobile" : "&mobile";
            if (typeof(hash) != "undefined") url += hash;
            location.replace(url);
        } else {
            location.replace(mobileMappingURL);
        }
    } else {
        location.replace(redirectURL);
    }

     

    이런 경우들은 사이트마다 제각각일 텐데 케바케로 주소를 따와야 하는 건가요ㅜㅜ

  • profile profile
    자꾸 답글 달아서 죄송합니다;;;

    해주셨던 말씀 참고해서 리다이렉트 주소 추적에 집중하기로 했습니다.
    주소가 리다이렉트되는 페이지의 콘텐츠를 php curl을 통해 가져올 때, 리다이렉트되는 최종의 최종 주소를 얻어내려고요ㅎㅎ

    현재 고려하고 있는 것은 다음 세 가지 경우인데요.

    1. header에 location 값이 있는 경우
    2. 메타 태그를 통해 리다이렉트 시키는 경우
    3. 스크립트를 통해 location을 바로 이동시키는 경우

    이 조건들을 가지고 재귀함수를 돌리면 최종 url의 콘텐츠를 가져올 수 있을 것 같아서요.
    한번 해보고 안 되면 .. 또 하소연 남길게요 ^^;;