조회 수 1124 추천 수 1 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form
라이선스 MIT

안녕하세요?


어제 humit 님의 블로그에서 네이트 실시간 검색어 순위에 대한 크롤링 방법에 관한 글을 읽고 많은 점을 느껴서

(https://humit.tistory.com/304?category=847273)


이를 PHP로 응용하여 간단하게나마 아미나 위젯으로 만들어 봤어요 ^^



이용자가 많은 사이트에서는 curl로 인해 해당 서버와 네이트 측에 많은 로딩이 걸릴 수 있어서 


아미나의 위젯 캐시(apms_wiget_cache)를 적용하였습니다.


캐시에 대해 좀 더 공부해보고 싶었고, humit 님께서 저번에 올려주신 스크립트도 있지만,


일단 빠른 개발을 위해귀차니즘 때문에 아미나 자체의 위젯 캐시를 사용해봤네요 ^^


캐시 이외에는 설정할 부분이 없기 때문에 별도의 위젯 설정 파일을 만들지 않고 $wset['cache'] = 10 부분을 하드코딩했네요.


<?php
if (!defined('_GNUBOARD_')) exit;
$wset['cache'] = 10;
echo apms_widget_cache($widget_path.'/parse.php', $wname, $wid, $wset);
?>



크롤링에서는 User-agent를 크롬으로 변경했고, 인코딩 관련하여 약간 귀찮은 부분이 있었네요.


문자열 처리에 있어서는 humit 님처럼 json과 관련된 함수를 이용한 멋진 방법이 아니라 정규식을 사용했습니다 ㅠㅠ


1위부터 10위까지 순위를 직접 파싱하지 않고, foreach문에서 $cnt 변수를 사용해서 돌렸는데 


저의 예감으로는 아마도 최선의 방법은 아닐 것 같네요 ㅜㅜ


원래는 CSS 파일을 분리해서 widget.css 파일을 만들려고 했지만


구글링해보니 아미나의 캐싱과 관련하여 까다로운 부분이 있는 것 같아서 부득이 PHP 파일에 포함시켰습니다.


<?php
if (!defined('_GNUBOARD_')) exit;
?>
<style>
.myWidget {
-moz-box-shadow: 3px 4px 0px 0px #4a4e4f;
-webkit-box-shadow: 3px 4px 0px 0px #4a4e4f;
box-shadow: 3px 4px 0px 0px #4a4e4f;
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #fcfcfc), color-stop(1, #e3dae3));
background:-moz-linear-gradient(top, #fcfcfc 5%, #e3dae3 100%);
background:-webkit-linear-gradient(top, #fcfcfc 5%, #e3dae3 100%);
background:-o-linear-gradient(top, #fcfcfc 5%, #e3dae3 100%);
background:-ms-linear-gradient(top, #fcfcfc 5%, #e3dae3 100%);
background:linear-gradient(to bottom, #fcfcfc 5%, #e3dae3 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fcfcfc', endColorstr='#e3dae3',GradientType=0);
background-color:#fcfcfc;
-moz-border-radius:15px;
-webkit-border-radius:15px;
border-radius:15px;
border:1px solid #d6bcd6;
display:inline-block;
color:#000000;
font-size:15px;
padding:7px 25px;
text-decoration:none;
text-shadow:0px 1px 0px #e1e2ed;
}
.myWidget:hover {
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #e7eb0e), color-stop(1, #ffffff));
background:-moz-linear-gradient(top, #e7eb0e 5%, #ffffff 100%);
background:-webkit-linear-gradient(top, #e3dae3 5%, #ffffff 100%);
background:-o-linear-gradient(top, #e3dae3 5%, #ffffff 100%);
background:-ms-linear-gradient(top, #e3dae3 5%, #ffffff 100%);
background:linear-gradient(to bottom, #e3dae3 5%, #ffffff 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e3dae3', endColorstr='#ffffff',GradientType=0);
background-color:#e3dae3;
}
.myWidget:active {
position:relative;
top:1px;
}
a.no_underline {
  text-decoration:none;
}
a.no_underline:hover {
  text-decoration:underline;
</style>

<?php
$json_url = 'https://www.nate.com/nate/LiveKeyword';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $json_url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);

preg_match_all('/\["[\d]{1,2}",\s"(.*?)",\s/', $result, $keyword);
$cnt = 1;
?>
<div class="myWidget">
<?php
echo '<span style="color:blue; font-weight:bold">'.date("m/d H:i:s").'</span><br>';
foreach ($keyword[1] as $data) {
    echo "<a class='no_underline' href='https://search.daum.net/nate?w=tot&q=".urlencode($data)."' target='_blank'><span style='color:red'>".$cnt."</span> ".iconv("EUC-KR", "UTF-8", $data).'</a><br>';
    ++$cnt;
}
?>
</div>


결과는 다음과 같고, 캐싱도 잘 작동합니다 ^^


일단 아미나를 사용하는 동안에는 아미나 자체의 캐시를 많이 연습하고 활용해보려구요.




여러모로 부족한 스크립트에 관한 글을 읽어주셔서 감사합니다 :)


제 연말 일정으로 볼 때 올해 소스 게시판에 글을 올리는 것은 이것으로 마지막이 될 것 같네요~


새해에는 저 혼자만의 스크립트 연습이 아니라 다른 분들께 보다 도움이 될 수 있는 스크립트를 올리도록 할게요 ^^


다른 분들께서도 바쁘실텐데 컨디션 관리 잘 하시고 그럼 남은 연말 즐겁고 뜻깊게 보내세요!


마스터 님을 비롯하여 모든 스포어 회원님들께 항상 감사드립니다~!

  • profile
    title: 황금 서버 (30일)humit 2018.12.18 20:52
    아미나에서 자체 캐시 함수가 있었군요!!
    코드 잘보고 갑니다 ㅎㅎ
  • profile
    이니스프리 2018.12.18 21:47

    앗 저의 부족한 코드를 봐주셔서 번번이 감사합니다~!

    humit 님께서 이미 파이썬으로 네이트 실검 크롤링 코드를 작성해주셔서 제가 허접하게나마 PHP로 옮길 수 있었네요 ^^

    아미나에 apms_widget_cache 함수와 apms_cache 함수라는 두 개의 캐시 함수가 있는데

    구글링해보니 후자는 예전 불당팩의 db_cache 함수를 수용한 것이라고 하더군요.

    캐싱이 정말 중요한 것 같은데 구글링해봐도 아미나(PHP 7.X)에서 redis를 바로 적용하는 팁이 없는 것 같더군요 ㅠㅠ

    다음주에 다시 추워진다는데 그럼 humit 님께서도 감기 조심하시고 즐거운 연말 되세요~!

  • profile
    니오 2019.04.29 23:34
    코드가 아직 안보이는 1인입니다

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
38 코드 파이선 셸에서 실행하면...? 3 제르엘 2018.07.22 546
37 코드 [Python] 모 정부기관 사이트 파싱 후 PC 통신처럼 열람하고 싶은 게시글 번호를 입력하면 내용을 보여주는 소스 (허접) 4 이니스프리 2018.09.14 744
36 코드 [오토핫키] 특정 사이트에 대한 ping 테스트 결과를 실행시간과 함께 로그 파일로 저장하는 스크립트 2 이니스프리 2018.09.22 2054
35 코드 [오토핫키] 구글 드라이브의 공유링크를 이미지 호스팅을 위한 다이렉트 링크로 바꿔주는 스크립트 10 file 이니스프리 2018.09.25 1754
34 코드 [PHP] 기상청 중기예보를 캐러셀로 보여주는 위젯 (매우 허접합니다 ㅠㅠ) 10 file 이니스프리 2018.09.28 733
33 코드 [오토핫키] 브라우저를 열어 지난번과 동일한 폴더에 MZK를 다운받고 압축을 네이티브로 해제하는 스크립트 file 이니스프리 2018.10.20 920
32 코드 [PHP] 기상청 RSS 시간별 예보 위젯 - cache 적용(?) 9 file 이니스프리 2018.10.28 992
31 코드 [PHP] 그누보드 자동 게시글 작성 - 일본기상협회의 우리나라 날씨를 크롤링한 후 파파고로 번역하여 글 작성 4 file 이니스프리 2018.11.15 822
30 코드 [아미나] 게시글을 작성하면 ID와 IP로 필터링하여 자동으로 랜덤 댓글을 남기기 (+랜덤 포인트) 7 file 이니스프리 2018.11.18 805
29 코드 [Python] 텔레그램을 이용한 게시판 새 글 알림봇 7 이니스프리 2018.12.02 3982
28 코드 [PHP] 간단한 캐싱 클래스 3 title: 황금 서버 (30일)humit 2018.12.06 855
27 코드 [아미나] 출석 여부를 나타내는 메인화면 위젯 4 file 이니스프리 2018.12.15 771
» 코드 [아미나] 네이트 실시간 검색어 순위 위젯 (아미나 캐시 적용) 3 file 이니스프리 2018.12.18 1124
25 코드 [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다) 6 이니스프리 2018.12.20 7994
24 코드 [JS] http를 https로 리디렉션! 3 Hanam09 2018.12.30 840
23 코드 [JS]클라이언트에서 Ip를 얻어보자 2 Hanam09 2019.01.21 777
22 코드 [Python] 선택한 파일을 Dropbox API를 이용하여 업로드하고 공유링크를 받아서 이미지 호스팅 용도로 URL을 변환하기 1 file 이니스프리 2019.07.02 1166
21 코드 [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트 2 file 이니스프리 2019.07.03 6105
20 코드 [PHP/Javascript] 아미나에 자동으로 게시글을 생성하고 Ajax로 전송하여 결과를 표시하기 2 file 이니스프리 2019.07.09 926
19 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 file 이니스프리 2019.07.12 1474
Board Pagination Prev 1 2 3 4 Next
/ 4