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

그누보드5 플러그인

그누보드는 여러가지 기능을 추가하기 쉽도록 제작 되었습니다.
플러그인 다운로드시 좋아요와 감사의 코멘트를 남기시면 제작자에게 큰 힘이됩니다. ^^y

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

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

첨부파일

첨부파일 gnuboard_scrap.zip (17.9K) 32회 다운로드 2018-01-05 22:15:29 포인트 차감800

본문

 

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

 

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

 

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. 그외
본 프로그램을 이용함에 있어 발생한 저작권 및 법적 문제는 본 개발자와 상관 없으며, 본 프로그램을 사용한 업체 또는 사용자에게 있습니다. 이 프로그램을 다운받아 사용한 경우 이 내용에 동의한것으로 간주합니다.

 

예제코드

$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>";
}
 

 

 /**
     * 대상 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;
    }

댓글 전체

감사합니다. 소스를 보니 제가 많이 부끄러워집니다.
그동안 일일이 preg_match 로 짜집기 했던 부분이 한줄로 간단하게 처리되는군요.
역시 고수의 코드는 표가 나는군요. 잘 활용하겠습니다.
composer 를 통해서 자동으로 다운받는 파일입니다. composer 사용법을 익히셔야 할것 같습니다. sir 에 보시면 컴포저 사용법 올려놓은 글이 있습니다.
감사합니다. 그러나 선생님 파일을 사용하면 이미지를 엑스박스(0kb로 다운로드)로 불러오네요...
그리고 jpg같은경우에는 해당 링크에서 직접 가져오네요...
혹시 해결방안이 없을까요?
Fatal error: Uncaught Error: Class 'GuzzleHttp\Client' not found in /home/@@@/public_html/lib/GnuboardScrap.php:25 Stack trace: #0 /home/@@@/public_html/extend/board_scrap_functions.php(279): GnuboardScrap->__construct('sir.kr', 'https') #1 /home/@@@/public_html/scrap_test.php(18): gnuboard_scrap('https://sir.kr/...', 'menu5_1') #2 {main} thrown in /home/@@@/public_html/lib/GnuboardScrap.php on line 25

인터넷 검색해서 composer 와 goutte까지 설치했습니다.
그리고 scrap_test.php 실행하니 이런 에러가 나오네요..
산한개 넘었는데 또 산입니다 ㅠㅠ;
전체 242
그누보드5 플러그인 내용 검색

회원로그인

진행중 포인트경매

  1. [추천도서] PHP7 예비학교

    참여14 회 시작18.04.25 14:47 종료18.04.30 14:47
  2. EditPlus5 (에디트플러스5 1인용)

    참여37 회 시작18.04.22 18:39 종료18.04.27 18:27
  3. 일전에 말씀드린 자전거용품 몇개 찾아봤습니다..

    참여17 회 시작18.04.22 14:55 종료18.04.27 14:55

(주)에스아이알소프트 (06253) 서울특별시 강남구 도곡로1길 14, 6층 624호 (역삼동, 삼일프라자) 대표메일:admin@sir.kr
사업자등록번호:217-81-36347 대표:홍석명 통신판매업신고번호:2014-서울강남-02098호 개인정보보호책임자:이총

© SIRSOFT