예: 웹사이트 데이터를 캡처하는 PHP 코드.
-
- /**
- * 이미지 캡처 클래스
- *
- * @package default
- * @author WuJunwei
- */
- class download_image
- {
-
- public $save_path / /이미지 저장 주소 캡처
-
- //이미지 크기 제한 캡처(단위:바이트) 이 제한보다 큰 이미지만 캡처
- public $img_size=0; 🎜> //반복적인 크롤링을 피하기 위해 이전에 크롤링한 하이퍼링크 주소를 기록하는 정적 배열을 정의합니다.
- public static $a_url_arr=array()
-
- /**
- * @param String $save_path 캡쳐된 이미지의 저장 주소
- * @param Int $img_size 캡쳐된 이미지의 저장 주소
- */
- public function __construct; ($save_path,$img_size)
- {
- $this->save_path=$save_path;
- $this->img_size=$img_size;
- }
-
- /**
- * 홈페이지 및 서브페이지의 이미지를 재귀적으로 다운로드하여 캡처하는 방법(재귀적 재귀)
- *
- * @param String $capture_url 이미지 캡처에 사용되는 URL
- *
- */
- 공용 함수 recursive_download_images($capture_url)
- {
- if (!in_array($capture_url,self::$a_url_arr)) //캡처 없음 통과
- {
- self ::$a_url_arr[]=$capture_url; // 정적 배열로 계산됨
- } else // 캡처됨, 함수를 직접 종료
- {
- return; this->download_current_page_images($capture_url); //현재 페이지의 모든 이미지를 다운로드합니다
-
- //읽을 수 없는 캡처 주소로 인한 경고 오류를 차단하려면 @를 사용하세요
- $content=@file_get_contents($capture_url );
-
- // 태그의 href 속성에서 ? 앞의 정규 부분을 일치시킵니다.
- $a_pattern = "|] href= ['" ]?([^ ' "?] )['" >]|U";
- preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER);
-
- $tmp_arr=array (); //배열을 정의하여 현재 루프에서 캡처된 이미지의 하이퍼링크 주소를 저장합니다.
- foreach ($a_out as $k => $v)
- {
- /**
- * 하이퍼링크에서 빈 '', '#', '/' 및 중복 값 제거
- * 1: 하이퍼링크 주소 값은 현재 크롤링된 페이지의 URL과 같을 수 없습니다. 그렇지 않으면 무한 루프에 빠지다
- * 2: 하이퍼링크가 '' 또는 '#'이면 '/'도 이 페이지이고, 이것도 무한 루프에 빠진다.
- * 3: 가끔 하이퍼링크 주소가 웹페이지에 여러 번 표시됩니다. 삭제하지 않으면 하위 페이지가 반복적으로 다운로드됩니다.
- */
- if ( $v[ 1] && !in_array($v[1],self::$a_url_arr) &&!in_array($v[1],array('#','/',$ Capture_url) ) )
- {
- $tmp_arr[]=$v[1]
- }
- }
-
- foreach ($tmp_arr as $k => $v)
- {
- //하이퍼링크 경로 주소
- if ( strpos($v, 'http://')!==false ) //url에 http://가 포함되어 있으면 직접 액세스할 수 있습니다.
- {
- $a_url = $v;
- }else //그렇지 않으면 상대 주소인 것으로 판명되며, 하이퍼링크의 액세스 주소를 재구성해야 합니다.
- {
- $domain_url = substr($capture_url, 0,strpos( $capture_url, ' /',8) 1)
- $a_url=$domain_url.$v
- }
-
- $this->recursive_download_images($a_url)
-
- }
- }
- /**
- * 현재 웹페이지 아래의 모든 이미지 다운로드
- *
- * @param String $capture_url 이미지 캡처에 사용되는 웹페이지 주소
- * @return Array 웹페이지의 모든 이미지에 대한 img 태그의 URL 주소 중 하나 현재 웹페이지 배열
- */
- 공개 함수 download_current_page_images($capture_url)
- {
- $content=@file_get_contents($capture_url) //Shield 경고 오류
-
- // img 태그의 src 속성에서 ? 앞의 일반 부분과 일치
- $img_pattern = "|] src=['" ]?([^ '"?] )[ ' " >]|U";
- preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER)
-
- $photo_num = count($img_out)
- // 일치하는 사진 수량
- echo '
'.$capture_url . "총 발견" . " 사진"
- foreach ($img_out as $k => $v) > $this->save_one_img($capture_url,$v[1])
- }
- }
-
- /**
- * 단일 이미지 저장 방법
- *
- * @param String $capture_url 이미지 캡처에 사용된 웹 주소
- * @param String $img_url 저장해야 하는 이미지의 URL
- *
- */
- 공개 함수 save_one_img($capture_url,$img_url)
- {
- //이미지 경로 주소
- if ( strpos($img_url, ' http://')!==false )
- {
- // $img_url = $img_url
- }else
- {
- $domain_url = substr($capture_url, 0,strpos( $capture_url, '/',8) 1); $img_url=$domain_url.$img_url;
- }
- $pathinfo = pathinfo($img_url); //이미지 경로 정보 가져오기
- $ pic_name=$pathinfo['basename']; //사진 이름을 가져옵니다
- if (file_exists($this->save_path.$pic_name)) //사진이 존재하면 캡쳐되었음을 증명합니다 , 함수 종료
- {
- echo $img_url . '이 이미지가 캡처되었습니다!
return; - }
- //이미지 내용을 문자열로 읽습니다.
- $img_data = @file_get_contents($img_url) //이미지 주소를 읽을 수 없어 발생하는 경고 오류 읽어보세요
- if ( strlen($img_data) > $this->img_size ) //크기가 제한보다 큰 사진을 다운로드합니다
- {
- $img_size = file_put_contents($this->save_path . $pic_name, $img_data );
- if ($img_size)
- {
- echo $img_url . '이미지가 저장되었습니다. < ;br/>';
- } else
- {
- echo $img_url ' 이미지를 저장하세요!
';
- }
- } else
- {
- echo $img_url '사진 읽기 실패!
';
- }
- }
- } // END
-
- set_time_limit(120); //스크립트의 최대 실행 시간을 상황에 따라 설정
- $download_img=new download_image('E:/images/',0) //다운로드 이미지 객체 인스턴스화
- $download_img-> recursive_download_images('http://bbs.it-home .org/'); //재귀적으로 이미지 캡처 방법
- //$download_img->download_current_page_images($_POST['capture_url']); 현재 페이지 이미지 방법
- ?>
-
코드 복사
|