基于PHP CURL獲取郵箱地址的詳解_PHP教程

      編輯Tag賺U幣

      推薦:解析CI即CodeIgniter框架在Nginx下的重寫規則
      本篇文章是對CI即CodeIgniter框架在Nginx下的重寫規則進行了詳細的分析介紹,需要的朋友參考下

      CURL可謂居家旅行必備之殺人良藥,為何如此形容?就是因為他好用方便能實現頁面抓取模擬登錄采集等一系列功能。
      記得第一次接觸CURL的時候是要實現完成從郵箱用戶列表的抓取。當時為了趕進度沒有細細研究只是網上找了一些資料實現了功能。現在把當初的代碼整理一下功能依舊能用
      復制代碼 代碼如下:www.wf0088.com

      <?php
      error_reporting ( 0 );
      set_time_limit ( 0 );
      header ( "Content-Type: text/html; charset=GB2312" );

      //郵箱用戶名密碼
      $user = 'username';
      $pass = 'password';

      //創建一個文件用于存放cookie信息
      define ( "COOKIEJAR", tempnam ( ini_get ( "upload_tmp_dir" ), "cookie" ) );

      $url = 'http://reg.163.com/logins.jsp?type=1&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D-1';
      $refer = 'http://mail.163.com';
      $fields_post = array ('username' => $user, 'password' => $pass, 'verifycookie' => 1, 'style' => - 1, ' $fields_string = http_build_query ( $fields_post, '&' );
      $headers_login = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0', 'Referer' => 'http://www.163.com' );

      //登錄
      $ch = curl_init ( $url );
      curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
      curl_setopt ( $ch, CURLOPT_HEADER, true );
      curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
      curl_setopt ( $ch, CURLOPT_POST, true );
      curl_setopt ( $ch, CURLOPT_REFERER, $refer );
      curl_setopt ( $ch, CURLOPT_COOKIESESSION, true );
      curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
      curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers_login );
      curl_setopt ( $ch, CURLOPT_POST, count ( $fields ) );
      curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields_string );
      $result = curl_exec ( $ch );
      curl_close ( $ch );

      //跳轉
      $url = 'http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=loki_wuxi';
      $headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );

      $ch = curl_init ( $url );
      curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
      curl_setopt ( $ch, CURLOPT_HEADER, true );
      curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
      curl_setopt ( $ch, CURLOPT_POST, true );
      curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
      curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
      curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
      $result = curl_exec ( $ch );
      curl_close ( $ch );

      //取得sid
      preg_match ( '/sid=[^\"].*/', $result, $location );
      $sid = substr ( $location [0], 4, - 1 );

      //通訊錄地址
      $url = 'http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid=' . $sid . '&gid=all';
      $headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );

      $ch = curl_init ( $url );
      curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
      curl_setopt ( $ch, CURLOPT_HEADER, true );
      curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
      curl_setopt ( $ch, CURLOPT_POST, true );
      curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
      curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
      curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
      $result = curl_exec ( $ch );
      curl_close ( $ch );
      unlink ( COOKIEJAR );

      //開始抓取內容
      preg_match_all ( '/<td class="Ibx_Td_addrName"><a[^>]*>(.*?)<\/a><\/td><td class="Ibx_Td_addrEmail"><a[^>]*>(.*?)<\/a><\/td>/i', $result, $infos, PREG_SET_ORDER );
      //1:姓名2:郵箱
      print_r ( $infos );
      ?>

      建立一個
      PHP文件復制以上代碼保存后效果立竿見影,記得更改郵箱賬戶和密碼,賬戶不需要@后綴。CURL初體驗,如何,還不錯吧。
      后來在CSDN上又看到別人發帖問一個獲取快遞查詢的問題,他想把一些大的快遞公司查詢業務做在一個頁面中,的確是個很不錯的實用小工具,但是因為快遞查詢有驗證碼,不由的又讓我想起了CURL利器。后來幫帖主實現功能,思路很簡單,先用CURL模擬抓取驗證碼,然后顯示到用戶提交頁面中,同時保存驗證碼的COOKIE等用戶查詢一起提交就保證了COOKIE的同步。

      源代碼如下:
      -getEms.html
      復制代碼 代碼如下:www.wf0088.com

      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
      <title>EMS快遞查詢</title>
      </head>
      <body>
      <?php
      fclose(fopen('cookie.txt','w')); //文件 cookie.txt 用于存放取得的cookie
      $cookiejar = realpath('cookie.txt');
      $fp = fopen("example_homepage.txt", "w"); //文件 example_homepage.txt 用于存放取得的頁面內容
      $ch = curl_init("http://www.ems.com.cn/servlet/ImageCaptchaServlet");
      curl_setopt($ch, CURLOPT_FILE, $fp);
      curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
      curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
      curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_exec($ch);
      curl_close($ch);
      fclose($fp);

      //readfile($cookiejar); //查看取到的 cookie
      //readfile("example_homepage.jpg"); //查看取到的圖片
      ?>
      <form action="getems.php" method="post" name="form1">
      快遞號:<input name="mailNum" type="text" value="EA739701017CS" />(13位 首尾2位都是字母)
      <input name="code" type="text" value="" />
      <?php echo "<img src='example_homepage.txt'>";?>
      <input type="submit" value="提交">
      </form>

      </body>
      </html>

      -getems.php
      復制代碼 代碼如下:www.wf0088.com

      <?php
      if($_POST){
      //使用先前驗證碼的cookie文件
      $cookiejar = realpath('cookie.txt');
      //獲取myEmsbarCode號 和驗證碼變量名
      $ch = curl_init("http://www.ems.com.cn");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
      curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
      $result = curl_exec($ch);
      curl_close($ch);
      preg_match("/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.*)\"\/>/isU",$result,$myEmsbarCode);
      preg_match("/<\/span><input name=\"(.*)\" type=\"text\"/isU",$result,$codename);

      $parm = array($codename[1]=>$_POST['code'],
      mailNum =>$_POST['mailNum'],
      myEmsbarCode=>$myEmsbarCode[1],
      reqCode=>'browseBASE'
      );

      $ch = curl_init("http://www.ems.com.cn/qcgzOutQueryAction.do");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
      curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_REFERER, "http://www.ems.com.cn");
      curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parm));
      $_source = curl_exec($ch);
      curl_close($ch);

      //搞定
      var_dump($_source);
      exit;
      }
      ?>

      對于CURL庫的參數詳解,網上有很多我直接收錄
      函數列表CURL庫一共有17個函數:
      curl_close:關閉CURL會話
      curl_copy_handle:復制一個CURL會話句柄,同時3復制其所有參數
      curl_errno:返回最后一個錯誤碼
      curl_error:返回一個字符串,用以描述當前會話的最后一個錯誤
      curl_exec:執行當前會話
      curl_getinfo:獲取特定信息
      curl_init:初始化CURL會話
      curl_multi_add_handle:在一個多連接會話中添加一個句柄
      curl_multi_close:關閉一個多句柄CRUL會話
      curl_multi_exec:執行一個多句柄CURL會話
      curl_multi_getcontent:返回一個句柄執行后的內容,如果設置了CURLOPT_RETURNTRANSFER
      curl_multi_info_read:獲取當前所有連接的信息
      curl_multi_init:初始化一個多句柄會話
      curl_multi_remove_handle:從一個多句柄會話中刪除一個句柄
      curl_multi_select:獲取所有綁定的套接字
      curl_setopt:設置CURL傳輸選項
      curl_version:獲取CURL版本
      常用設置選項布爾值選項
      CURLOPT_AUTOREFERER:當返回的信息頭含有轉向信息時,自動設置前向連接
      CURLOPT_BINARYTRANSFER:TRUEtoreturntherawoutputwhenCURLOPT_RETURNTRANSFERisused.
      CURLOPT_COOKIESESSION:標志為新的cookie會話,忽略之前設置的cookie會話
      CURLOPT_CRLF:將Unix系統的換行符轉換為Dos換行符
      CURLOPT_DNS_USE_GLOBAL_CACHE:使用全局的DNS緩存
      CURLOPT_FAILONERROR:忽略返回錯誤
      CURLOPT_FILETIME:獲取請求文檔的修改日期,該日期可以用curl_getinfo()獲取。
      CURLOPT_FOLLOWLOCATION:緊隨服務器返回的所有重定向信息
      CURLOPT_FORBID_REUSE:當進程處理完畢后強制關閉會話,不再緩存供重用
      CURLOPT_FRESH_CONNECT:強制建立一個新的會話,而不是重用緩存的會話
      CURLOPT_HEADER:在返回的輸出中包含響應頭信息
      CURLOPT_HTTPGET:設置HTTP請求方式為GET
      CURLOPT_HTTPPROXYTUNNEL:經由一個HTTP代理建立連接
      CURLOPT_NOBODY:返回的輸出中不包含文檔信息.
      CURLOPT_NOPROGRESS:禁止進程級別傳輸,PHP自動設為真
      CURLOPT_NOSIGNAL:忽略所有發往PHP的信息
      CURLOPT_POST:設置POST方式提交數據,POST格式為application/x-www-form-urlencoded
      CURLOPT_PUTTRUE:設置PUT方式上傳文件,同時設置CURLOPT_INFILE和CURLOPT_INFILESIZE
      CURLOPT_RETURNTRANSFER:返回字符串,而不是調用curl_exec()后直接輸出
      CURLOPT_SSL_VERIFYPEER:SSL驗證開啟
      CURLOPT_UNRESTRICTED_AUTH:一直鏈接后面附加用戶名和密碼,同時設置CURLOPT_FOLLOWLOCATION
      CURLOPT_UPLOAD:準備上傳整數值選項
      CURLOPT_BUFFERSIZE:緩存大小
      CURLOPT_CONNECTTIMEOUT:連接時間設置,默認0為無限制
      CURLOPT_DNS_CACHE_TIMEOUT:內存中保存DNS信息的時間,默認2分鐘
      CURLOPT_INFILESIZE:上傳至遠程站點的文件尺寸
      CURLOPT_LOW_SPEED_LIMIT:傳輸最低速度限制andabort.
      CURLOPT_LOW_SPEED_TIME:傳輸時間限制
      CURLOPT_MAXCONNECTS:最大持久連接數
      CURLOPT_MAXREDIRS:最大轉向數
      CURLOPT_PORT:連接端口
      CURLOPT_PROXYAUTH:*****驗證方式
      CURLOPT_PROXYPORT:*****端口
      CURLOPT_PROXYTYPE:*****類型
      CURLOPT_TIMEOUT:CURL函數的最大執行時間字符串選項
      CURLOPT_COOKIE:HTTP頭中set-cookie中的cookie信息
      CURLOPT_COOKIEFILE:包含cookie信息的文件,cookie文件的格式可以是Netscape格式,或者只是HTTP頭的格式
      CURLOPT_COOKIEJAR:連接結束后保存cookie信息的文件
      CURLOPT_CUSTOMREQUEST:自定義請求頭,使用相對地址
      CURLOPT_ENCODING:HTTP請求頭中Accept-Encoding的值
      CURLOPT_POSTFIELDS:POST格式提交的數據內容
      CURLOPT_PROXY:代理通道
      CURLOPT_PROXYUSERPWD:代理認證用戶名和密碼
      CURLOPT_RANGE:返回數據的范圍,以字節記
      CURLOPT_REFERER:前向鏈接
      CURLOPT_URL:要連接的URL地址,可以在curl_init()中設置
      CURLOPT_USERAGENT:HTTP頭中User-Agent的值
      CURLOPT_USERPWD:連接種使用的驗證信息數組選項
      CURLOPT_HTTP200ALIASES:200響應碼數組,數組中的響應嗎被認為是正確的響應
      CURLOPT_HTTPHEADER:自定義請求頭信息只能是流句柄的選項:
      CURLOPT_FILE:傳輸要寫入的晚間句柄,默認是標準輸出
      CURLOPT_INFILE:傳輸要讀取的文件句柄
      CURLOPT_STDERR:作為標準錯誤輸出的一個替換選項
      CURLOPT_WRITEHEADER:傳輸頭信息要寫入的文件回調函數選項
      CURLOPT_HEADERFUNCTION:擁有兩個參數的回調函數,第一個是參數是會話句柄,第二是HTTP響應頭信息的字符串。使用此回調函數,將自行處理響應頭信息。響應頭信息按行返回。設置返回值為字符串長度。
      CURLOPT_READFUNCTION:擁有兩個參數的回調函數,第一個是參數是會話句柄,第二是HTTP響應頭信息的字符串。使用此函數,將自行處理返回的數據。返回值為數據尺寸。
      CURLOPT_WRITEFUNCTION:擁有兩個參數的回調函數,第一個是參數是會話句柄,第二是HTTP響應頭信息的字符串。使用此回調函數,將自行處理響應頭信息。響應頭信息是整個字符串。設置返回值為字符串長度。
      其他一些CURL的例子 (摘自網絡)
      復制代碼 代碼如下:www.wf0088.com

      /*
      *判斷一個url是否為有效鏈接
      */
      function isRealUrl($url){
      $ch = curl_init();
      $options = array(
      CURLOPT_URL => $url,
      CURLOPT_HEADER => true,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_NOBODY => true
      );
      curl_setopt_array($ch, $options);
      curl_exec($ch);
      if(!curl_errno($ch)){
      return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)?true:false;
      }
      curl_close($ch);
      }

      $url = 'http://testpic1.tomoimg.cn/240x180/394/855/517932781/200901/12312215602409.jpg';
      if(isRealUrl($url)){echo 'yes';}else{echo 'no';}

      /異步請求的例子:
      $userid = 517932781;
      $imageid = 1520;
      $albumid = 2637;
      $tags = 'aa';
      extract($_POST);
      $url = 'http://'.$_SERVER['HTTP_HOST'].'/ajax/image.php';
      $fields = array(
      'userid' => $userid,
      'imageid' => $imageid,
      'albumid' => $albumid,
      'tags' => $tags,
      'optype' => 'del'
      );
      $ch = curl_init() ;
      curl_setopt($ch, CURLOPT_URL,$url) ;
      curl_setopt($ch, CURLOPT_POST,true) ;
      curl_setopt($ch, CURLOPT_POSTFIELDS,$fields) ;
      $result = curl_exec($ch) ;
      curl_close($ch) ;

      //上傳文件
      $ch = curl_init();
      curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/import.php');
      $fields = array(
      'tname' => '道德經',
      'country' => 1,
      'author' => '老子',
      'tags' => '道德經',
      'desc' => '道可道,非常道。名可名,非常名。無名天地之始。有名萬物之母。故常無欲以觀其妙。常有欲以觀其徼。此兩者同出而異名,同謂之玄。玄之又玄,眾妙之門。',
      'volume' => 2,
      'cover' => '@'.realpath('/data/lianhuanhua/deal/1.jpg')
      );
      curl_setopt($ch, CURLOPT_POST, true) ;
      curl_setopt($ch, CURLOPT_POSTFIELDS, $fields) ;
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
      $result = curl_exec($ch);
      curl_close($ch);

      //多文件上傳
      $ch = curl_init();
      curl_setopt($ch,CURLOPT_URL,'http://lh.tom.com/deal/addpic.php');
      $j = 0;
      $fields = array(
      'vid' => 103,
      'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/1.jpg'),
      'upfile['.$j++.']' => '@'.realpath('/data/lianhuanhua/deal/2.jpg')
      );
      curl_setopt($ch, CURLOPT_POST, true) ;
      curl_setopt($ch, CURLOPT_POSTFIELDS, $fields) ;
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
      $result = curl_exec($ch);
      curl_close($ch);

      當你掌握了php curl庫你就能做很多你想做的事情了,呵呵,前不久玩開心網的X世界,戰斗實在繁瑣,我直接寫了個戰斗助手非常好用,本代碼就不開源了 :)掌握原理一樣開源實現。
      網站計數器

      分享:深入php函數file_get_contents超時處理的方法詳解
      本篇文章是對php函數file_get_contents超時處理的方法進行了詳細的分析介紹,需要的朋友參考下

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-06-04
      相關PHP教程