curlは局外採集の方法と技巧を実現する

4486 ワード

curlを選んだ理由
curlとfileについてget_contents、わかりやすい対比を抜粋:file_get_contentsは、file_などのファイル操作関数を内蔵した統合バージョンです.exists、fopen、fread、fcloseは、怠け者に専門的に提供されており、主にローカルファイルに対処するために使用されていますが、怠け者のためであり、同時にネットワークファイルのサポートに参加しています.curlはネットワークインタラクションに特化したライブラリであり、異なる環境に対応するためのカスタムオプションが多数用意されており、安定性は当然fileよりも大きい.get_contents.
使用方法
1、curlサポートを開く
php環境のインストール後、curlのサポートがデフォルトで開いていないため、phpを変更する必要があります.iniファイル、見つかりました;extension=php_curl.dll、前のコロンを消して、サービスを再起動すればいいです.
2、curlを用いてデータの取り込みを行う
 
  
// 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("/
  • (.*?)/",$data, $out, PREG_SET_ORDER);
    foreach($out as $key => $value){
        // $value ,
        echo ' :'.$value[0].'
    ';
        echo ' :'.$value[1].'
    ';
    }

  • テクニック
    1、タイムアウトに関する設定
    curlを通してsetopt($ch,opt)は、主に次のようなタイムアウトの設定を設定できます.
    CURLOPT_TIMEOUTは、cURLで実行できる最長秒数を設定します.CURLOPT_TIMEOUT_MSは、cURLで実行できる最長ミリ秒数を設定する.(cURL 7.16.2に組み込まれています.PHP 5.2.3から使用可能です.)CURLOPT_CONNECTIMEOUT接続開始までの待ち時間は、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、postでデータを提出し、クッキーを保留する
     
      
    // , :
    //Curl discuz , DZ7.0

    !extension_loaded('curl') && die('The curl extension is not loaded.');   

    $discuz_url = 'http://www.lxvoip.com';//    
    $login_url = $discuz_url .'/logging.php?action=login';//    
    $get_url = $discuz_url .'/my.php?item=threads'; //    

    $post_fields = array();   
    //    
    $post_fields['loginfield'] = 'username';   
    $post_fields['loginsubmit'] = 'true';   
    // ,    
    $post_fields['username'] = 'lxvoip';   
    $post_fields['password'] = '88888888';   
    //    
    $post_fields['questionid'] = 0;   
    $post_fields['answer'] = '';   
    //@todo    
    $post_fields['seccodeverify'] = '';   

    // 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('//i', $contents, $matches);   
    if(!empty($matches)) {   
        $formhash = $matches[1];   
    } else {   
        die('Not found the forumhash.');   
    }   

    //POST , COOKIE   
    $cookie_file = dirname(__FILE__) . '/cookie.txt';   
    //$cookie_file = tempnam('/tmp');   
    $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);