본문 바로가기
php

[php] simple_html_dom을 활용한 크롤링(스크래핑)

by 하이바네 2022. 6. 16.
반응형

웹 사이트에 돌아다니는 필요한 정보를 수집하는 것을 크롤링이라고 한다. 보통 스크래핑이라고도 부른다.

 

정확한 뜻은 "웹 사이트에서 데이터를 추출하는 행위" 이다.

 

크롤링의 활용 예시)

1. 경쟁사 쇼핑몰의 가격정보를 추출

2. 유머게시판, 자유게시판의 데이터를 추출

3. 주식 정보를 추출

....

 

웹 사이트상에서 url로 접근 되는곳의 정보는 모두 추출 할 수 있다고 보면 된다. (단 노가다가 필요하고, 저작권 등에 문제가 발생할 수 있다. )

 

여기서 "노가다"가 필요하다고 한 이유는 웹 페이지의 내용을 가져오기 위해서는 html구조를 보고 규칙을 파악하여야 한다는 것이다. 그 안에서 최적의 방법으로 데이터를 가져오면 된다.

 

simple_html_dom에 대한 정보는 아래의 사이트를 가면 자세히 볼 수 있으며, 소스를 받고 예시들을 참조해서 사용하면 된다.

 

Simple HTML DOM documentation

PHP Simple HTML DOM Parser A fast, simple and reliable HTML document parser for PHP. Created by S.C. Chen, based on HTML Parser for PHP 4 by Jose Solorzano. Parse any HTML document PHP Simple HTML DOM Parser handles any HTML document, even ones that are co

simplehtmldom.sourceforge.io

 

아래는 직접 dcinside의 실시간 베스트 글을 크롤링한 결과물이다.

 

아래는 작성 했던 코드인데, 실제로 사용하려면 iframe으로 빠진것을 img src를 다운받게 한 후 나머지 처리 등 나머지 태그들에 대해서도 분석하여 처리가 필요하다. 그리고 중간에 sleep이 들어간 이유는 빠르게 접속하게되면 일반적으로 ip차단을 하는곳이 있기에 넣었다. 조금만 수정하고 추가하면 충분히 이미지까지 크롤링해서 가져올 수 있을것으로 보인다.

 

<?php
include("simple_html_dom.php");

//상수 선언
$SLEEP = 2;

//사용 함수(예정)


$html = file_get_html('https://www.dcinside.com/');

$idx =0;//테스트용

//실시간 베스트 가져오기
foreach($html->find('.time_best li > a') as $a ){
    
    sleep($SLEEP);
    $board_data = file_get_html ($a->href);
    $url = $a->href;

    $title = $board_data->find('.title_subject',0);
    $writer = $board_data->find('.gall_writer .nickname',0);
    $contents = $board_data->find('.gallview_contents .write_div',0);
    
    //이미지 출력
    foreach($contents->find('img') as $img){

        
        if($img->attr['onclick']){

            $img_url = explode('\'', $img->attr['onclick']);

            //이미지를 저장 후 기존 contents에서 찾아서 replace시킬것(iframe은 임시 테스트)
            echo "<iframe src='$img_url[1]'></iframe>";
          
        }
        else{//onClick이 attr을 이용하여 생성(첫번째 이미지에 해당)
        }

    }
    
    echo $url;
    
    echo '<br>';
    echo $title;
    echo '<br>';
    /*
    echo $writer;
    echo '<br>';
    echo $contents;
    */

    //테스트용
    $idx++;
    if($idx==2)
        break;

}
?>

 

728x90

댓글