IT 전용글

PHP Snoopy 관련

회상형인간 2014. 10. 14. 10:38
보통 PHP에서 RSS나 외부 사이트의 내용을 긁어서 가공하려고 할 때에는 소켓을 이용해 웹 페이지를 긁어오게 되는데, snoopy라는 파싱 클래스 라이브러리(http://snoopy.sourceforge.net/)를 이용하면 이러한 작업을 매우 간단하게 해결할 수 있는 장점이 있습니다. curl을 이용하기 때문에 fopen을 막아놓은 경우에도 시원하게 긁어오는 등 외부 사이트 크롤링과 파싱에서 탁월한 성능을 보여주기 때문에 저도 자주 애용하고 있는데요. 심지어는 로그인이나 특정 매개변수를 POST로 submit해 집어넣어야 하는 페이지에도 적용할 수 있는 등 쓰임새가 참 다양합니다.

그런데 보통 이 크롤링 작업은 외부 사이트의 내용을 어떻게 잘 발라내느냐가 관건이 되기 때문에 긁어오는 것보다도 긁은 다음에 목적에 맞게 정보를 끄집어내는 해석 작업이 더 중요한 경우가 많습니다. 그래서 이런 작업에서는 정규식 짜는 게 훨씬 골치인 경우가 많습니다. 수많은 태그에서 일관성을 발견하고 이를 적절하게 처리해내야 하기 때문이죠. 그런데 경우에 따라서는 발라내기 전 단계에서 뜻하지 않은 오류가 나오는 경우가 생기곤 하는데요. 바로 해당 사이트가 외부에서 웹브라우저가 아닌 프로그램이 접근해 들어오는 걸 차단할 때입니다.

제가 이번에 아내의 천연 원석 주얼리 숍 『지혜로운 연꽃』(http://wiselotus.net)을 위한 정보 클리핑을 시작하면서 부딪친 게 바로 이 부분입니다. 뉴스는 구글에서 해당 키워드에 해당하는 RSS를 죄 제공해주기 때문에 고맙게도 RSS 파싱만 하면 됐거든요. 그런데 주얼리 관련 쇼핑 인기 검색어/브랜드를 추출하려고 하니, 로컬에서 작업할 때엔 잘 되던 게 막상 웹서버에 올리니 작동을 안 하는 겁니다. 왜인가 봤더니, 해당 정보를 끌어오려던 네이버가 외부 프로그램 접속을 틀어막고 있더군요. 메인 페이지는 딱히 차단 안 합니다. 문제는 검색결과 페이지입니다.

이 프로그램을 짜게 된 계기가 우연한 기회에 '발찌'를 검색했더니 네이버에서 주얼리 관련 쇼핑 인기 검색어와 인기 브랜드를 오른쪽에 배치해주길래 이걸 매일 정리하면 꽤 괜찮은 정보가 되겠군 싶었던 건데, 정작 다 짜 놓은 걸 서버에 올리면 제대로 결과가 안 나오는 겁니다. 소스 자체가 문제가 있으면 로컬에서도 작동을 안 해야 하는 건데 이상타 해서 정보를 뒤져보니 리퍼러(접속해 들어온 웹 주소 기록)를 네이버로 맞추라네, 헤더를 브라우저와 통일하라네 하는 내용들이 나오더군요. 그런데 아무리 맞춰봐도 안 되는 겁니다. 그래서 이 프로그램에서 해당 기능을 버려둔 채로 한참을 묵혀두고 있었습니다. 아내 블로그에서 일단 굴리고 있다가 그도 잠시 멈춰둔 상태였습니다. 그러다가 이대로 멈춰두면 안 되겠다 싶어서 다시 붙들었는데, 여전히 잘 안 되더군요. 된다는 사람들은 대체 어떻게 된다는 거지 하다가 혹시 몰라서 IP 우회로인 프록시를 써 봤습니다.

***

▷ 빠른 프록시 서버 모음

http://proxy.web2r.net/

*** 

 

여기에서 제공하는 IP를 적용합니다. 로컬에서 작업할 때에는 해당 프록시 서버가 로컬(127.0.0.1) 쪽으로 바로 진입해 들어오진 못하므로 예외처리를 해 주긴 해야 합니다.

 

*** 

 

$snoopy->proxy_host = "175.118.112.51";
$snoopy->proxy_port = "80";

***

 

단숨에 모든 문제가 해결되는 걸 보면서 살짝 허탈했습니다. 팁이라고 올라온 것들에서 프록시가 언급된 경우도 없었거니와, 네이버가 호스팅 서버에서의 접근을 아예 틀어막고 있다는 증거를 본 셈이기도 했기 때문입니다. 네이버 경고 화면 내용은 이렇습니다.

 

***

 

사용 중이신 PC 또는 네트워크에서 네이버의 안정적인 검색 서비스를 방해하는 내용이 감지되었습니다. 네이버 검색에서는 프로그램을 이용한 자동 검색을 방지하고자 보안 절차를 거치도록 하고 있습니다. 보안 절차를 통과하면 검색 서비스를 정상적으로 이용하실 수 있습니다. 보안 절차를 통과하려면 [제한 해제] 버튼을 클릭하세요.

*** 

 

다른 곳도 아니고 밖에서 들어오는 정보를 안에 우겨넣고 자기복제를 반복해 트래픽을 유발하는 데에 선수인 네이버가 바깥으로 데이터가 나가는 건 꼭꼭 틀어막고 있으니 이런 경고가 꽤 고깝게 느껴지는 건 어쩔 수 없네요.

 

어쨌든 네이버 검색 결과를 PHP에서 snoopy를 통해 긁어오려 하시는 분이 계시다면 괜히 헤더나 리퍼러 삽질로 해결하려 하지 마시고 맘 편하게 프록시를 써서 우회하십시오. 다만 한 가지. 공개 프록시가 가끔 제대로 작동을 하지 않는 경우가 있는데 이는 감수하셔야 할 듯합니다.