[PHP] cURL(HttpConnection)을 이용해서 Naver와 Daum의 실시간 API를 가져오는 방법


Development note/PHP  2019. 11. 26. 09:00

안녕하세요. 명월입니다.


이 글은 HttpConnection을 이용해서 Naver와 Daum의 실시간 API를 가져오는 방법에 대한 글입니다.


Naver와 Daum에서 제공하는 실시간 검색 순위는 여러모로 데이터 분석을 위해 스크래핑을 하면 꽤 유용하게 사용할 수 있습니다. 예를 들면 1년간 데이터를 수집해서 1년간 데이터 검색의 추이던가 이슈등의 키워드를 가져와서 블로그나 빅데이터로 사용할 수도 있습니다. 물론 1년간 수집을 해야한다는 런닝 타임이 필요하겠네요. 예전에는 약 5년전만에도 포털 api에서 제공을 했었는데 지금은 제공하지 않습니다.

아마도 실시간 키워드은 마켓팅 등으로 활용할 수 있는 분야가 많기 때문에 포털 사이트에서 막아 놓았을 수도 있습니다.


그러나 웹사이트에 게시가 되는 이상 스크래핑을 이용해서 가져올 수 있습니다.

먼저 네이버의 view-source로 살펴보면 확인할 수 있습니다.

링크 - view-source:https://www.naver.com

위 소스를 보면(검색어는 제가 모자이크 처리했습니다.) div.PM_CL_realtimeKeyword_rolling 클래스로 실시간 검색어가 web페이지에 나오는 것을 확인 할 수 있습니다.


이번에는 daum의 view-source를 살펴보겠습니다.

링크 - view-source:https://www.daum.net

daum의 경우에는 div.realtime_part의 클래스로 실시간 검색어의 데이터가 있네요.


Java의 경우 HttpUrlConnection을 통해서 가져오면 되고 C#의 경우는 WebRequest로 값을 가져오면 됩니다.

링크 - [C#] HttpConnection을 이용해서 웹 페이지 가져오기

링크 - [Java] HttpUrlConnection을 이용해서 웹 페이지를 가져오기


저의 경우에는 좀 더 편하게 만들기 위해서 PHP의 cUrl로 취득해 오겠습니다.

링크 - [PHP] PHP의 HttpConnection 도구 cURL 사용 방법

링크 - [PHP] htmlParser(phpquery라이브러리)를 이용해 XML파일(HTML)을 사용하는 방법

<?php
require_once "vendor/autoload.php";
// http로 접속하여 html를 가져온다.
function connectHttp($url, $post, $param, $header = null)
{
  $handle = curl_init();
  try {
    curl_setopt($handle, CURLOPT_URL, $url);
    curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($handle, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($handle, CURLOPT_POST, $post);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $param);
    curl_setopt($handle, CURLOPT_VERBOSE, TRUE);
    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($handle, CURLOPT_HEADER, TRUE);
    if ($header !== null) {
      curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
    }
    $response = curl_exec($handle);
    $header_size = curl_getinfo($handle, CURLINFO_HEADER_SIZE);
    $header_map = array();
    $header = substr($response, 0, $header_size);
    $temp = explode("\r\n", $header);
    array_push($header_map, $temp[0]);
    foreach ($temp as $item) {
      $temp2 = explode(":", $item);
      $header_map[$temp2[0]] = str_replace($temp2[0] . ":", "", $item);
    }
    $body = substr($response, $header_size);
    return array(
      "header" => $header_map,
      "body" => $body
    );
  } finally {
    curl_close($handle);
  }
}
// Naver에 접속하여 html파일을 가져온다.
$ret = connectHttp("https://www.naver.com", "GET", null);
phpQuery::newDocumentHTML($ret["body"]);
//div.PM_CL_realtimeKeyword_rolling의 클래스의 엘리먼트를 취득해 온다.
$naver = pq('div.PM_CL_realtimeKeyword_rolling')->html();

// Daum에 접속하여 html파일을 가져온다.
$ret = connectHttp("https://www.daum.net", "GET", null);
phpQuery::newDocumentHTML($ret["body"]);
//div.realtime_part의 클래스의 엘리먼트를 취득해 온다.
$daum = pq('div.realtime_part')->html();
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
  <style>
    /*Daum의 경우는 왜 데이터가 두개씩 들어가 있는지...*/
    .roll_txt .rank_cont:last-child{
      display:none;
    }
    ul,ol{
      list-style: none;
    }
  </style>
</head>
<body>
  <!-- 네이버의 검색 결과 -->
  <div>naver result</div>
  <div>
    <?=$naver?>
  </div>
  <!-- 다음의 검색 결과 -->
  <div>daum result</div>
  <div>
    <?=$daum?>
  </div>
</body>
</html>

네이버와 다음의 실시간 정보를 가져와서 화면에 출력했습니다.

저의 경우는 그냥 예제를 만들기 위해 웹으로 작성해서 데이터를 가져와서 화면에 보여주는 역할만 만들었습니다.

C#이나 java로 Thread를 이용하거나 스케줄링을 이용한 배치 프로그램을 만들어서 시간 간격으로 데이터를 수집해서 데이터 베이스에 넣는 프로그램을 만든다면 네이버와 다음 실시간 데이터를 수집할 수 있겠네요. 데이터가 많이 쌓이게 되면 여러가지로 활용해 볼만 하겠습니다.


여기까지 HttpConnection을 이용해서 Naver와 Daum의 실시간 API를 가져오는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.