테스트 사이트 - 개발 중인 베타 버전입니다

정규식을 사용하지 않는 그누보드 파서입니다.

· 7년 전 · 14933 · 59
FireShot Capture 3 - 자유게시판 1 페이지 I 그누보드5 - http___198.13.52.205_bbs_board.php_bo_tablefreepage.png

 

기존에 팁게시판에 올린 소스를 활용하여, 완전한 소스형태를 개발하였습니다.

 

상업용으로 사용가능한 소스는 따로 컨텐츠몰에 업로드할 예정입니다.

 

https://sir.kr/g5_tip/6977 게시판 파싱후 글등록 처리 함수

https://sir.kr/g5_tip/6999 PHP를 이용한 심플한 게시판 파싱 방법(Guzzle + domcralwer)

 

1. 사전 내용
 - 이 소스는 PHP 5.5 또는 그 이상에서 정상동작합니다.
 - 5.4 이하 버전에서는 composer 실행시 라이브러리 설치가 정상적으로 되지 않습니다.

 

2. 디렉토리 구성 및 파일
 - /lib/GnuboardScrap.php 그누보드 파싱을 위한 메인 파일  
 - /extend/board_scrap_functions.php 파싱처리 및 게시물 등록 함수모음
 - /scrap_test.php  : 파싱(스크래핑) 테스트용 php 파일
 - /README.txt

 

3. 설정방법
 - composer 를 이용하여 goutte를 설치하셔야 합니다.
 - composer 설치와 이용에 관한 정보는 인터넷을 참고바랍니다.
   composer.json 내용은 아래와 같습니다.
{
  "require": {
    "php": ">=5.6.0",
    "guzzlehttp/guzzle": "~6.0",
    "symfony/dom-crawler": "3.4.*",
    "symfony/css-selector": "3.4.*",
    "fabpot/goutte" : "^3.1"
  }
}

 

4. 사용방법
  - 압축을 푼 다음 디렉토리 구조에 맞게 업로드 합니다.  
  - 첨부된 scrap_test.php 를 작성하여 실행해 봅니다.
    그누보드 유머게시판이 잘 파싱되는지 확인합니다. 
  - 대상사이트 구조에 맞춰서 GnuboardScrap.php 파일 내 dom selector 를 변경합니다. 

 

5. 라이센스
  - 자세한 라이센스는 소스파일내 라이센스 구문을 참조바랍니다.  
  
6. 그외
본 프로그램을 이용함에 있어 발생한 저작권 및 법적 문제는 본 개발자와 상관 없으며, 본 프로그램을 사용한 업체 또는 사용자에게 있습니다. 이 프로그램을 다운받아 사용한 경우 이 내용에 동의한것으로 간주합니다.

 

예제코드

[code]

$url = "https://sir.kr/cm_humor/p1"; //파싱 대상 url, 유머게시판 1페이지

$target_bo_table = "free";//파싱후 등록할 대상 게시판

$result_list = gnuboard_scrap($url, $target_bo_table);

echo "<h3>파싱후 등록된 게시물</h3></br>";
for($i =0; $i < count($i); $i++) {
    $row = $result_list[$i];
    echo "<a href='/bbs/board.php?bo_table={$target_bo_table}&wr_id={$row['wr_id']}' target='_blank'>{$row['wr_id']} {$row['wr_subject']}</a><br>";
}
 

[/code]

 

[code]

 /**
     * 대상 url 게시물을 파싱후 게시판에 등록한다.
     * @param $url 파싱 대상 url
     * @param $target_bo_table 파싱후 등록할 대상 테이블
     * @return array  게시물들이 등록되면, 등록한 wr_id
     */
    function gnuboard_scrap($url, $target_bo_table, $print_debug = false) {
        global $g5, $member;

        include_once dirname(__DIR__)."/lib/GnuboardScrap.php";

        $ym = date('ym', G5_SERVER_TIME);

        $upload_temp_dir = G5_DATA_PATH."/scrap"; //임시 업로드 디렉토리
        @mkdir($upload_temp_dir, G5_DIR_PERMISSION);
        @chmod($upload_temp_dir, G5_DIR_PERMISSION);

        $upload_editor_dir = G5_DATA_PATH."/editor/".$ym; //에디터 업로드 디렉토리
        @mkdir($upload_editor_dir, G5_DIR_PERMISSION);
        @chmod($upload_editor_dir, G5_DIR_PERMISSION);

        $url_info = parse_url($url);

        $domain = $url_info['host'];
        $scheme = $url_info['scheme'];
        $uri = $url_info['path'].($url_info['query'] ? "?".$url_info['query'] : "");


        $result = array();

        $scrap = new GnuboardScrap($domain, $scheme);

        if($print_debug) {
            $scrap->setDebug(true);
        }

        $list = $scrap->getList($uri);

        foreach($list as $row) {
            //todo 이미 파싱한 게시물인지 체크, $row['wr_id'] 값을 게시물에 저장후 중복된 데이타인지 체크

            $contents = $scrap->getContent($row['wr_id'], $row['content_url']);

            $upload_data_list = array();

            //todo 가변파일로 업로드된 이미지와, 에디터 embed 이미지는 분리하여 처리하여야 하나
            //      불필요하게 코드를 복잡하게 만들기 때문에, 에디터 embed 이미지로 처리한다.
            for($i = 0;$i<count($contents['content_images']); $i++) {

                $download_url = $contents['content_images'][$i];

                $url_info  = parse_url($download_url);
                $path_info = pathinfo($url_info['path']);
                $filename = $path_info['basename'];
                $filename = generate_new_filename($filename); //원본 이미지 url 경로와 다른 파일명으로 저장한다.

                $upload_filepath = $scrap->downloadUrlImage($download_url, $upload_editor_dir, $filename);

                //다운로드 url 경로와 다운로드 받은 파일경로를 같이 저장한다.
                $upload_data_list[] = array(
                      "original_url" => $download_url
                    , "upload_filepath" => "/".G5_DATA_DIR."/editor/".$ym."/".$filename
                );
            }

            //게시판 본문 이미지 태그의 정보를 다운로드한 이미지 경로로 변경한다.
            $contents['wr_content'] = board_content_image_replace($contents['wr_content'], $upload_data_list);

            $wr_id  = board_write($target_bo_table, $contents);

            $result[] = array("wr_subject" => $contents['wr_subject'], "wr_id" => $wr_id);

            //가변파일을 처리하는 경우, 임시 업로드된 이미지를 삭제한다.
            //foreach (glob($upload_temp_dir."/*") as $temp_filename) {
            //    unlink($temp_filename);
            //}


            sleep(1);
            //FIXME 예제코드가 sir.co.kr 유머게시판을 파싱합니다.
            //과도한 트래픽과 request를 방지하기 위해 게시물 1개만 파싱되도록 하였습니다.
            //페이지별로 전체를 파싱하기 위해선 아래 break 문을 삭제하시면 됩니다.
            //과도한 request가 발생하면 sir.co.kr 사이트에서 접속이 차단될수 있습니다.(주의바람)
            //sir.co.kr 에 대한 파싱은 테스트로만 사용하길 바랍니다.
            break;

        }

        if($print_debug) {
            print_r2($scrap->getDebugInfo());
        }

        return $result;
    }


[/code]

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 59개

지금도 가능한 부분인가요..
4년 전
sir 사이트 구조가 변경되지 않았다면, 가능합니다.
현재 웹호스팅을 받아 홈페이지를 운영중인데,
composer는 서버호스팅을 받아 설치해야하는 부분이죠??ㅠㅠ
웹호스팅은 사용이 불가하죠..?ㅠㅠ
4년 전
가능한곳도 있지만, 안되는곳이 더 많을것 같네요. 호스팅 업체에 문의해보세요. 파서 못쓰게 ㅘ는 웹호스팅도 있을것 같네요.
4년 전
감사합니다
3년 전
감사합니다.
좋은 자료 감사합니다.
감사합니다.
1년 전

그누 파서 감사합니다

게시글 목록

번호 제목
13945
13943
13939
13932
13931
13923
13911
13906
13891
13884
13873
13861