CURL可謂居家旅行必備之殺人良藥,為何如此形容?就是因為他好用方便能實現頁面抓模數擬登入採集等一系列功能。
記得第一次接觸CURL的時候是要實現完成從信箱使用者列表的抓取。當時為了趕進度沒有細細研究只是網上找了一些資料實現了功能。現在把當初的代碼整理一下功能依舊能用
複製代碼 代碼如下:
<?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, 'product' => 'mail163', 'selType' => - 1, 'secure' => 'on' );
$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
複製代碼 代碼如下:
<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
複製代碼 代碼如下:
<?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的例子 (摘自網路)
複製代碼 代碼如下:
/*
*判斷一個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 = 'yun_qi_img/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世界,戰鬥實在繁瑣,我直接寫了個戰鬥助手非常好用,本代碼就不開源了 :)掌握原理一樣開源實現。
網站計數器