> 백엔드 개발 > PHP 튜토리얼 > PHP 데이터 수집 클래스 Snoopy 사용

PHP 데이터 수집 클래스 Snoopy 사용

巴扎黑
풀어 주다: 2016-11-22 16:38:42
원래의
1608명이 탐색했습니다.

PHP 컬렉션 스누피에 대한 자세한 설명
PHP 컬렉션 도구 스누피 애플리케이션에 대한 자세한 설명
스누피는 브라우저의 기능을 시뮬레이션하고 웹 콘텐츠를 가져오고 양식을 보낼 수 있는 PHP 클래스입니다. 스누피가 올바르게 작동하려면 서버의 PHP 버전이 4 이상이어야 하며 기본 LAMP 서비스에서 지원되는 PCRE(Perl Compatible Regular Expressions)를 지원해야 합니다.
1. 스누피의 일부 기능:
1. 웹페이지의 콘텐츠 가져오기
2. 웹페이지의 텍스트 콘텐츠 가져오기(HTML 태그 제거) fetchtext
3. 링크 가져오기 및 웹페이지 fetchlinks fetchform 형식
4. 프록시 호스트 지원
5. 기본 사용자 이름/비밀번호 확인 지원
6. user_agent, 리퍼러(소스), 쿠키 및 헤더 콘텐츠(헤더 파일) 설정 지원
7 .브라우저 리디렉션 지원 및 리디렉션 깊이 제어 가능
8. 웹 페이지의 링크를 고품질 URL로 확장 가능(기본값)
9. 데이터 제출 및 반환 값 얻기 ​​
10. 지원 추적 HTML 프레임워크
11. 리디렉션 시 쿠키 전달을 지원합니다. PHP4 이상이 필요하며, 서버가 컬을 지원하지 않는 경우 지원을 확장할 필요가 없습니다.
2. 클래스 메소드:
fetch($URI)
————–
웹페이지의 내용을 캡처하는 데 사용되는 메소드입니다. $URI 매개변수는 크롤링된 웹페이지의 URL 주소입니다. 가져온 결과는 $this->results에 저장됩니다. 프레임을 스크랩하는 경우 스누피는 각 프레임을 추적하여 배열에 저장한 다음 $this->results에 저장합니다.
fetchtext($URI)
——————
이 메서드는 fetch()와 유사하지만 유일한 차이점은 이 메서드가 HTML 태그 및 기타 관련 없는 데이터를 제거하고 텍스트 내용만 반환한다는 것입니다. 웹페이지에서.
fetchform($URI)
——————
이 메서드는 fetch()와 유사하지만 유일한 차이점은 이 메서드가 HTML 태그 및 기타 관련 없는 데이터를 제거하고 형식만 반환한다는 것입니다. 웹페이지의 콘텐츠(양식)입니다.
fetchlinks($URI)
————-
이 메서드는 fetch()와 유사하지만 유일한 차이점은 이 메서드가 HTML 태그 및 기타 관련 없는 데이터를 제거하고 다음의 링크만 반환한다는 것입니다. 웹페이지(링크).
기본적으로 상대 링크는 자동으로 완성되어 전체 URL로 변환됩니다.
submit($URI,$formvars)
————————-
이 메소드는 $URL에 지정된 링크 주소로 확인 양식을 보냅니다. $formvars는 양식 매개변수를 저장하는 배열입니다.
submittext($URI,$formvars)
————————–
이 메서드는 submit()과 유사하지만 유일한 차이점은 이 메서드가 HTML 태그 및 기타 관련 없는 데이터를 제거한다는 것입니다. . 로그인 후 웹페이지의 텍스트 내용만 반환됩니다.
submitlinks($URI)
————-
이 메소드는 submit()과 유사하지만 유일한 차이점은 이 메소드가 HTML 태그 및 기타 관련 없는 데이터를 제거하고 다음의 링크만 반환한다는 것입니다. 웹페이지(링크).
기본적으로 상대 링크는 자동으로 완성되어 완전한 URL로 변환됩니다.
3. 클래스 속성: (기본값은 대괄호 안에 있음)
$host 연결된 호스트
$port 연결된 포트
$proxy_host 사용된 프록시 호스트(있는 경우)
$ Proxy_port 프록시 사용된 호스트 포트(있는 경우)
$agent 사용자 에이전트 위장(Snoopy v0.1)
$referer 소스 정보(있는 경우)
$cookies 쿠키(있는 경우)
$rawheaders 기타 헤더 정보(있는 경우)
$maxredirs 최대 리디렉션 수, 0=허용되지 않음(5)
$offsiteok 오프사이트 리디렉션을 허용할지 여부(true)
$expandlinks 전체 주소에 대한 모든 링크를 완료할지 여부(true) )
$user 인증 사용자 이름(사용 가능한 경우)
$pass 인증 사용자 이름(사용 가능한 경우)
$accept http 허용 유형( image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */ *)
$error 오류를 보고할 위치(있는 경우)
$response_code 서버에서 반환된 응답 코드
$headers 서버에서 반환된 헤더 정보
$maxlength 반환된 가장 긴 데이터 길이
$read_timeout 읽기 작업 시간 초과(PHP 4 Beta 4+ 필요)
시간 초과가 없는 경우 0으로 설정
$timed_out 한 번 읽으면 가져오기 작업 시간이 초과되면 이 속성은 true를 반환합니다(PHP 4 Beta 4+ 필요).
$maxframes 추적이 허용되는 최대 프레임 수
$status 캡처된 http 상태
$temp_dir 웹 서버가 쓸 수 있는 임시 파일 디렉터리(/tmp)
$curl_path cURL 바이너리 디렉터리 , cURL 바이너리가 없으면 false로 설정하세요.
4. 다음은 데모입니다.
include "Snoopy.class.php"
$snoopy = new Snoopy-> ;proxy_host = "www.baidu.com";
$snoopy->proxy_port = "8080";
$snoopy->agent = "(호환; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98 )";
$snoopy->referer = "http://www.baidu.com/";
$snoopy->cookies["SessionID" ] = 238472834723489l;
$snoopy->cookies["favoriteColor"] = "빨간색"; 
$snoopy->rawheaders["Pragma"] = "캐시 없음"; 
$snoopy->maxredirs = 2; 
$snoopy->offsiteok = false; 
$snoopy->expandlinks = false; 
$snoopy->user = "조"; 
$snoopy->pass = "블로이"; 
if($snoopy->fetchtext("http://www.baidu.com")) 

echo "

".htmlspecialchars($snoopy->results). "
n";
 
}
 
다른
 
echo "문서를 가져오는 동안 오류가 발생했습니다: ".$snoopy->error."n"; 
snoopy采集phpchina示例 
//采集phpchina 
set_time_limit(0); 
require_once("Snoopy.class.php"); 
$snoopy=새 스누피(); 
//登陆论坛 
$submit_url = "http://www.phpchina.com/bbs/logging.php?action=login"; 
$submit_vars["loginmode"] = "정상"; 
$submit_vars["styleid"] = "1"; 
$submit_vars["cookietime"] = "315360000"; 
$submit_vars["loginfield"] = "사용자 이름"; 
$submit_vars["username"] = "***"; //사용목적 이름 
$submit_vars["password"] = "*****"; //你的密码 
$submit_vars["questionid"] = "0"; 
$submit_vars["답변"] = ""; 
$submit_vars["loginsubmit"] = "로그인"; 
$snoopy->submit($submit_url,$submit_vars); 
if ($snoopy->results) 

//获取连接地址 
$snoopy->fetchlinks("http://www.phpchina.com/bbs"); 
$url=배열(); 
$url=$snoopy->결과; 
//print_r($url); 
foreach($url as $key=>$value) 

//匹配http://www.phpchina.com/bbs/forumdisplay.php?fid=156&sid=VfcqTR地址即论坛板块地址 
if (!preg_match("/^(http://www.phpchina.com/bbs/forumdisplay.php?fid=)[0-9]*&sid=[a-zA-Z]{6 }/i",$value)) 

unset($url[$key]); 


//print_r($url); 
//获取到板块数组$url,循环访问,此处获取第一个模块第一页的数据 
$i=0; 
foreach($url as $key=>$value) 

if ($i>=1) 

//测试限system 
break; 

그밖에는 

//访问该模块,提取帖子的连接地址,正式访问里需要提取帖子分页的数据,然厥根据分页数据提取帖子数据 
$snoopy= 새로운 스누피(); 
$snoopy->fetchlinks($value); 
$tie=배열(); 
$tie[$i]=$snoopy->결과; 
//print_r($tie); 
//转换数组 
foreach($tie[$i] as $key=>$value) 

//匹配http://www.phpchina.com/bbs/viewthread .php?tid=68127& extra=page%3D1&page=1&sid=iBLZfK 
if (!preg_match("/^(http://www.phpchina.com/bbs/viewthread.php?tid=)[0-9]*& extra=page%3D1&page=[0-9]*&sid=[a-zA-Z]{6}/i",$value)) 

unset($tie[$i][ $키]); 


//print_r($tie[$i]); 
//归类数组,将同一个帖子는 서로 다릅니다.
$left='';//连接左边公용지址 
$j=0; 
$page=배열(); 
foreach($tie[$i] as $key=>$value) 

$left=substr($value,0,52); 
$m=0; 
foreach($tie[$i] as $pkey=>$pvalue) 

//重组数组 
if (substr($pvalue,0,52)==$left)

$페이지[$j][$m]=$pvalue; 
$m++; 


$j++; 

//去除重复项开始 
//$page=array_unique($page);只能用于一维数组 
$paget[0]=$page[0]; 
$nums=count($page); 
($n=1;$n <$nums;$n++) 

$paget[$n]=array_diff($page[$n],$page[$n-1 ]); 

//去除多维数组重复值结束 
//去除数组空值 
unset($page); 
$page=array();//새롭게 페이지 정리 
$page=array_filter($paget); 
//print_r($page); 
$u=0; 
$title=배열(); 
$content=배열(); 
$temp=''; 
$tt=배열(); 
foreach($page as $key=>$value) 

//外围循环,针对一个帖子 
if (is_array($value)) 

foreach ($value as $k1=>$v1) 

//页内循环,针对一个帖子的N页 
$스누피=새 스누피(); 
$snoopy->fetch($v1); 
$temp=$snoopy->결과; 
//读取标题 
if (!preg_match_all("/

(.*)

/i",$temp,$tt)) 

echo "제목 없음"; 
퇴장; 

그밖에 

$title[$u]=$tt[1][1]; 

설정 해제($tt); 
//读取内容 
if (!preg_match_all("/
(.*) /i",$temp,$tt)) 

print_r($tt); 
echo "콘텐츠 없음1"; 
퇴장; 

else 

foreach($tt[1] as $c=>$c2) 

$content[$u].=$c2; 




else 

//直接取页内容 
$snoopy=new Snoopy(); 
$snoopy->fetch($value); 
$temp=$snoopy->결과; 
//读取标题 
if (!preg_match_all("/

(.*)

/i",$temp,$tt)) 

echo "제목 없음"; 
퇴장; 

그밖에 

$title[$u]=$tt[1][1]; 

설정 해제($tt); 
//读取内容 
if (!preg_match_all("/
(.*)
/i ",$temp,$tt)) 

echo "콘텐츠 없음2"; 
퇴장; 

else 

foreach($tt[1] as $c=>$c2) 

$content[$u].=$c2; 



$u++; 

print_r($content); 

$i++; 


else 

echo "로그인 실패"; 
퇴장; 

?>

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿