기존에 팁게시판에 올린 소스를 활용하여, 완전한 소스형태를 개발하였습니다.
상업용으로 사용가능한 소스는 따로 컨텐츠몰에 업로드할 예정입니다.
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개
게시글 목록
| 번호 | 제목 |
|---|---|
| 13945 | |
| 13943 | |
| 13939 | |
| 13932 | |
| 13931 | |
| 13923 | |
| 13911 | |
| 13906 | |
| 13891 | |
| 13884 | |
| 13873 | |
| 13861 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기