괜찮은 웹스크랩 api를 발견했는데요.
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.4 |
국내 포털 업체에서 사용하는 api 엔드포인트로, url을 입력하면 해당 페이지의 url은 물론 title, description, image, hostname 등을 알아낼 수 있더군요.
첫 시도시에는 살짝 시간이 걸리긴 하지만 캐시가 적용되는지 두 번째부터는 빠르게 크롤링해서 결과값을 뿌려줍니다.
근데 이게 공개된 api 같지는 않구요.
호기심에서, 정말 호기심에서 개발자도구로 뜯어보다가 알게 된 거거든요.
이걸 활용해서 자료를 만들어볼까 하는데 그러면 안 되겠죠?
도의적으로도 문제가 있을 것 같고, 언제 닫힐지 불안정하기도 하고요.
답은 뻔히 아는데, 코딩 노동이 고달프니 하소연을 해봅니다 흑흑.

윤삼
Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
댓글 25
그 예전에
유명 부동산 중개 사이트2곳에서 발생한 사건이 생각나네요(숙소 플랫폼이였네요)
http://economychosun.com/client/news/view.php?boardName=C05&t_num=13611638
A사에서 B사의 백엔드 api를 무단 크롤링하여 데이터를 자사 서비스에 제공했었는데, B사에서 A사를 고소했고 A사가 수십억을 물어줬다고 들었던거 같아요 ㅎㅎ;;
프론트에 있는 데이터를 크롤링하는건 모두에게 공개된 정보라 볼 수 있어서 법적 문제가 없는데, api를 뜯어가는건 정상적인 접근으로 얻은 정보가 아니라 법적 문제를 졌던거로 기억합니다
케이스에 따라서 영업 방해도 적용 가능하겠네요
위에 예시들과 말씀하시는 상황이 약간 다르긴 하지만.. 타 사이트의 api를 뜯어서 사용하는건 지양하는게 좋겠죠 ^^;;
좋은 예시 감사합니다. 정신이 번쩍 드네요.
요즘은 빈 페이지 때려놓고 자바스크립트로 내용을 가져오는 경우들이 많잖아요. 메타 태그도 그 시점에야 생성되는 사이트들이 종종 꽤 있어서 자꾸 꼼수가 없을까 기웃거리게 됩니다ㅜ
selenium + chromedriver 같은 애들로 실제 브라우저 환경을 에뮬레이팅한 다음에 받아오는 방식으로 해결이 가능할거 같아요
파이썬 + AWS Lambda 조합으로 api 서버 하나 판 다음에, 요청 후 1초 대기해서 메타 데이터 읽어오는 코드 짜면..?
예전에 웹사이트 파싱용으로 람다를 써보려고 하긴 했는데, 람다가 시간이 오래 걸릴 수록 과금량이 상당해져서 크롤링용으로는 좀 부담이 되긴 하더라고요 (가끔씩 타임아웃 걸릴정도로 느린 사이트가 걸리면 대기 시간동안 계속 과금이 되어버리는 ㅎㅎ;;)
+) 만약 이 아이디어 사용하시려면 크롬드라이버 옵션에 이미지 로드하지 않는 옵션 있으니 그거 적용하시는게 좋을거 같아요
요즘은 잡는 코드마다 다 실패네요ㅜㅜ
화이팅입니다!
가격 모니터링용도로 운영중인데 캡쳐속도 괜찮습니다. ( 순간왕창들어오는데 가끔 누락되는거 빼곤 잘됨 // 서버사양 별로 안높음 )
어쨌든 웹호스팅 + 라이믹스 + php + javascript 만으로는 동적 페이지 스크래핑이 어렵다는 건 확실히 알 것 같습니다ㅜㅜ
웹호스팅으로는 사실상 불가능합니다.
단독서버 환경이라면 php로도 가능은 합니다..
https://github.com/php-webdriver/php-webdriver
별도로 스크랩하는 서버를 분리하고 하는게 부하나 이런 부분떄문에 심적으로 편안합니다.
역시 취미생활자가 넘볼 수 있는 영역이 아니네요. 좌절이 심각합니다ㅜ
대단한 데이터 크롤링도 아니고 메타태그 스크랩하는 것조차 이렇게 힘드네요.
메타태그마저 가로막거나 동적으로 생성하는 사이트들 나빠요.
윤삼 님~ 안녕하세요? ^^
Python의 Requests_HTML 모듈을 사용하면 Selenium을 직접 이용하지 않더라도
Javascript 렌더링이 가능합니다!
Requests_HTML이 Selenium보다 더 빠르고 간결해요~
그리고 Python이 익숙하지 않으시더라도 Requests_HTML로 GET 요청을 하여 Javascript 렌더링을 한 후
BeautifulSoup으로 파싱하는 작업은 간단히 하실거에요 :)
그럼 작업 홧팅하시고 편안한 저녁 되세요! ^-^
말씀하신대로면 파이썬 설치가 전제돼야 하는 거죠?
그러려면 웹호스팅 내에 파이썬을 설치하고 라이믹스 코어랑 왔다갔다 하면서 데이터를 주고 받아야 하는 건가요?
옙 일부 웹호스팅에서 Python을 지원하는 것으로 알고 있어요 ^-^
다만 권한 등 문제로 Python 모듈 설치가 어느 정도까지 가능한지는 케바케더군요 ㅠ.ㅠ
다른 분들 말씀처럼 API 서버를 별도로 구축하시는게 가장 확실한 방법이겠죠~
만약 웹호스팅에서 Requests_HTML 모듈이 작동한다면 Python -> PHP로 데이터를 넘기는 것은 어렵지 않습니다!
참고 : https://sir.kr/qa/316473
그럼 윤삼 님께서도 편안한 밤 되세요 :)
웹 스크래핑 이용자들이 함께 쓸 수 있는 공용 서버 같은 게 있어도 좋겠네요ㅎㅎ
암튼 말씀 감사합니다!!
동적렌더링하고 상관이 없을것 같아요.
주소 리다이렉트되는 건 curl로 어떻게든 추적을 해보고 있는데요.
메타 태그까지 동적으로 생성하는 페이지도 있는 것 같더라구요.
심지어 js로 주소를 리다이렉트를 시켜주기도 하구요;;;
그리고 메타 태그를 아예 설정하지 않은 사이트들도 꽤 있어서 본문을 참조해야 하는 경우도 있습니다.
앗, 그렇게 말씀하시니 리다이렉트 되는 걸 제대로 따라가질 못해서 그런 것 같기도 하네요ㅎㅎ
메타 태그 생성은 순전히 추측인데요.
제가 테스트로 시도해보다 어려움을 느꼈던 곳의 도메인들은 대강 이렇습니다.
각자 다른 이유들에서 스크랩이 잘 안 되는 것 같더라구요.
'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 부동산 인테리어"로 바뀌네요.
네이버 지식인의 경우는 콘텐츠를 받아서 디버깅해보니 자바스크립트로 주소를 리다이렉트시켜주는 경우이네요.
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);
}
이런 경우들은 사이트마다 제각각일 텐데 케바케로 주소를 따와야 하는 건가요ㅜㅜ
해주셨던 말씀 참고해서 리다이렉트 주소 추적에 집중하기로 했습니다.
주소가 리다이렉트되는 페이지의 콘텐츠를 php curl을 통해 가져올 때, 리다이렉트되는 최종의 최종 주소를 얻어내려고요ㅎㅎ
현재 고려하고 있는 것은 다음 세 가지 경우인데요.
1. header에 location 값이 있는 경우
2. 메타 태그를 통해 리다이렉트 시키는 경우
3. 스크립트를 통해 location을 바로 이동시키는 경우
이 조건들을 가지고 재귀함수를 돌리면 최종 url의 콘텐츠를 가져올 수 있을 것 같아서요.
한번 해보고 안 되면 .. 또 하소연 남길게요 ^^;;