>  기사  >  백엔드 개발  >  PHP 컬은 오프사이트 수집을 구현합니다(권장)

PHP 컬은 오프사이트 수집을 구현합니다(권장)

PHPz
PHPz원래의
2017-04-03 18:09:061642검색

curl은 네트워크 상호작용에 특별히 사용되는 라이브러리입니다. 다양한 환경을 처리할 수 있는 다양한 사용자 정의 옵션을 제공합니다. 안정성은 당연히 file_get_contents보다 높습니다.

curl을 선택하는 이유

컬과 file_get_contents에 대한 이해하기 쉬운 비교는 다음과 같습니다.
file_get_contents는 실제로 file_exists, fopen, fread, fclose, 게으른 사용자를 위해 특별히 제공되는 사람들이 사용하며 주로 로컬 파일을 처리하는 데 사용되지만 게으른 사람들 때문에 네트워크 파일에 대한 지원도 추가합니다.
curl은 네트워크 상호 작용을 위해 특별히 사용되는 라이브러리입니다. a 힙 사용자 정의 옵션은 다양한 환경을 처리하는 데 사용되며 안정성은 당연히 file_get_contents보다 높습니다.

사용방법

1. 컬 지원 켜기

PHP 환경 설치 후에는 컬 지원이 기본적으로 켜지지 않기 때문에, php.ini 파일을 수정하고,extension=php_curl.dll을 찾아서 앞에 있는 콜론을 제거하고 서비스를 다시 시작해야 합니다.

2. 컬을 사용하여 데이터를 캡처합니다

코드는 다음과 같습니다.

// 初始化一个 cURL 对象 
$curl = curl_init(); 
// 设置你需要抓取的URL 
curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn'); 
// 设置header 
curl_setopt($curl, CURLOPT_HEADER, 1); 
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
// 运行cURL,请求网页 
$data = curl_exec($curl); 
// 关闭URL请求 
curl_close($curl);

3. 정규 매칭을 통해 핵심 데이터 찾기

코드는 다음과 같습니다.

//$data是curl_exec返回的的值,即采集的目标内容 
preg_match_all("/<li class=\"item\">(.*?)<\/li>/",$data, $out, PREG_SET_ORDER); 
foreach($out as $key => $value){ 
    //此处$value是数组,同时记录找到带匹配字符的整句和单独匹配的字符 
    echo &#39;匹配到的整句:&#39;.$value[0].&#39;
&#39;; 
    echo &#39;单独匹配到的:&#39;.$value[1].&#39;
&#39;; 
}

1. 🎜>

curl_setopt($ch, opt )를 통해 주로 다음을 포함한 일부 시간 초과 설정을 지정할 수 있습니다.

CURLOPT_TIMEOUT은 cURL이 실행되도록 허용되는 최대 시간(초)을 설정합니다.

CURLOPT_TIMEOUT_MS는 cURL 실행이 허용되는 최대 밀리초 수를 설정합니다. (cURL 7.16.2에 추가됨. PHP 5.2.3부터 사용 가능)
CURLOPT_CONNECTTIMEOUT 연결을 시작하기 전 대기 시간을 0으로 설정하면 무한정 대기합니다.
CURLOPT_CONNECTTIMEOUT_MS 연결 시도를 기다리는 시간(밀리초)입니다. 0으로 설정하면 무한 대기합니다. cURL 7.16.2에 추가되었습니다. PHP 5.2.3부터 사용 가능합니다.
CURLOPT_DNS_CACHE_TIMEOUT은 DNS 정보를 메모리에 저장하는 시간을 설정하며 기본값은 120초입니다.

코드는 다음과 같습니다.

curl_setopt($ch, CURLOPT_TIMEOUT, 60);   //只需要设置一个秒的数量就可以 
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超时一定要设置这个 
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用

2. 게시를 통해 데이터를 제출하고 쿠키를 유지합니다.

코드는 다음과 같습니다.

//以下摘抄一个例子过来,用于学习借鉴: 
//Curl 模拟登录 discuz 程序,适合DZ7.0 
!extension_loaded(&#39;curl&#39;) && die(&#39;The curl extension is not loaded.&#39;);    
$discuz_url = &#39;http://www.lxvoip.com&#39;;//论坛地址    
$login_url = $discuz_url .&#39;/logging.php?action=login&#39;;//登录页地址    
$get_url = $discuz_url .&#39;/my.php?item=threads&#39;; //我的帖子    
$post_fields = array();    
//以下两项不需要修改    
$post_fields[&#39;loginfield&#39;] = &#39;username&#39;;    
$post_fields[&#39;loginsubmit&#39;] = &#39;true&#39;;    
//用户名和密码,必须填写    
$post_fields[&#39;username&#39;] = &#39;lxvoip&#39;;    
$post_fields[&#39;password&#39;] = &#39;88888888&#39;;    
//安全提问    
$post_fields[&#39;questionid&#39;] = 0;    
$post_fields[&#39;answer&#39;] = &#39;&#39;;    
//@todo验证码    
$post_fields[&#39;seccodeverify&#39;] = &#39;&#39;;    
//获取表单FORMHASH    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
$contents = curl_exec($ch);    
curl_close($ch);    
preg_match(&#39;/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i&#39;, $contents, $matches);    
if(!empty($matches)) {    
    $formhash = $matches[1];    
} else {    
    die(&#39;Not found the forumhash.&#39;);    
}    
//POST数据,获取COOKIE    
$cookie_file = dirname(__FILE__) . &#39;/cookie.txt&#39;;    
//$cookie_file = tempnam(&#39;/tmp&#39;);    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
curl_setopt($ch, CURLOPT_POST, 1);    
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);    
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    
curl_exec($ch);    
curl_close($ch);    
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容    
$ch = curl_init($get_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);    
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);    
$contents = curl_exec($ch);    
curl_close($ch);    
var_dump($contents);


위 내용은 PHP 컬은 오프사이트 수집을 구현합니다(권장)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.