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

그누보드5 플러그인

그누보드는 다양한 기능을 추가하기 쉽습니다.

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

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

첨부파일

gnuboard_scrap.zip (17.9K) 164회 다운로드 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;
    }

추천
11

댓글 전체

감사합니다. 소스를 보니 제가 많이 부끄러워집니다.
그동안 일일이 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 실행하니 이런 에러가 나오네요..
산한개 넘었는데 또 산입니다 ㅠㅠ;
선발대 보고드려요~
sir 파싱으로 셋팅되어 있어서 sir 외에 다른 사이트는 현재 셋팅으론 불가합니다.
확인하시고 다운받으세요~
안녕하세요 명량폐인님
게시글은 파싱이 잘되는데 이미지가 0바이트로  불러와지는 현상이 있습니다.
위 스크립트 board_write($bo_table, $contents, $files = Array() ) 중 $파일에 변수를 넣지 않아서 그런게 아닌가 하는 생각이 듭니다 어느걸 넣어야 할까요?
아하... sir의 유머게시판도 차단이 되어있다고 볼 수 있는건가요?
명랑폐인님의 기본 소스로 파싱하면 0바이트로 다운로드 됩니다.
당연히 가능합니다. 요즘 많이 쓰는 방법이고,
좀더 복잡하게 만들면, 트레이딩 봇이 되는것입니다.
api로 시세를 파싱하고, 자체 조건과 필터값을 적용한뒤에 구매/매수를 보내고, 해당 메세지들을 다시 텔레그램에 보내게 됩니다.
현재 웹호스팅을 받아 홈페이지를 운영중인데,
composer는 서버호스팅을 받아 설치해야하는 부분이죠??ㅠㅠ
웹호스팅은 사용이 불가하죠..?ㅠㅠ
가능한곳도 있지만, 안되는곳이 더 많을것 같네요. 호스팅 업체에 문의해보세요. 파서 못쓰게 ㅘ는 웹호스팅도 있을것 같네요.
전체 504
그누보드5 플러그인 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT