정규식을 사용하지 않는 그누보드 파서입니다. 정보
정규식을 사용하지 않는 그누보드 파서입니다.첨부파일
본문
기존에 팁게시판에 올린 소스를 활용하여, 완전한 소스형태를 개발하였습니다.
상업용으로 사용가능한 소스는 따로 컨텐츠몰에 업로드할 예정입니다.
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
댓글 전체
낭중에 필요할때 또 다운받겠습니다. ㅎ
신고가 접수된 글입니다.
신고 횟수가 1회 이상이면 글을 확인하지 못합니다.
감사합니다.
그동안 일일이 preg_match 로 짜집기 했던 부분이 한줄로 간단하게 처리되는군요.
역시 고수의 코드는 표가 나는군요. 잘 활용하겠습니다.
그리고 jpg같은경우에는 해당 링크에서 직접 가져오네요...
혹시 해결방안이 없을까요?
인터넷 검색해서 composer 와 goutte까지 설치했습니다.
그리고 scrap_test.php 실행하니 이런 에러가 나오네요..
산한개 넘었는데 또 산입니다 ㅠㅠ;
신고가 접수된 글입니다.
신고 횟수가 1회 이상이면 글을 확인하지 못합니다.
sir 파싱으로 셋팅되어 있어서 sir 외에 다른 사이트는 현재 셋팅으론 불가합니다.
확인하시고 다운받으세요~
게시글은 파싱이 잘되는데 이미지가 0바이트로 불러와지는 현상이 있습니다.
위 스크립트 board_write($bo_table, $contents, $files = Array() ) 중 $파일에 변수를 넣지 않아서 그런게 아닌가 하는 생각이 듭니다 어느걸 넣어야 할까요?
명랑폐인님의 기본 소스로 파싱하면 0바이트로 다운로드 됩니다.
좀더 복잡하게 만들면, 트레이딩 봇이 되는것입니다.
api로 시세를 파싱하고, 자체 조건과 필터값을 적용한뒤에 구매/매수를 보내고, 해당 메세지들을 다시 텔레그램에 보내게 됩니다.
composer는 서버호스팅을 받아 설치해야하는 부분이죠??ㅠㅠ
웹호스팅은 사용이 불가하죠..?ㅠㅠ
그누 파서 감사합니다