[PHP] cURL(HttpConnection)을 이용해서 Naver와 Daum의 실시간 API를 가져오는 방법
안녕하세요. 명월입니다.
이 글은 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를 가져오는 방법에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Development note > PHP' 카테고리의 다른 글
[PHP] FTP를 접속하여 파일을 업로드, 다운로드, FTP 초기화하는 방법 (0) | 2020.02.20 |
---|---|
[PHP] cmd (커맨드 명령어)를 실행하는 방법 (0) | 2020.01.14 |
[PHP] 암복호화 함수 md5와 base64 (0) | 2019.11.13 |
[PHP] 날짜와 시간을 다루는 방법 (0) | 2019.11.11 |
[PHP] Socket통신을 하는 방법 (1) | 2019.11.10 |
[PHP] 직렬화(Serializable) (0) | 2019.11.09 |
[PHP] PHP와 JSP 간의 Session 공유(WDDX) (2) | 2019.11.08 |
[PHP] PHP에서 파일을 압축 또는 해제하는 방법 (0) | 2019.11.07 |