亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > PHP > 正文

php采集神器cURL使用方法詳解

2024-05-04 23:43:10
字體:
供稿:網(wǎng)友
這篇文章主要為大家詳細(xì)介紹了php采集神器cURL使用方法,file_get_contents函數(shù)獲取遠(yuǎn)程鏈接的數(shù)據(jù)更具有優(yōu)勢(shì),感興趣的小伙伴們可以參考一下
 

對(duì)于做過數(shù)據(jù)采集的人來說,cURL一定不會(huì)陌生。雖然在PHP中有file_get_contents函數(shù)可以獲取遠(yuǎn)程鏈接的數(shù)據(jù),但是它的可控制性太差了,對(duì)于各種復(fù)雜情況的采集情景,file_get_contents顯得有點(diǎn)無能為力。因此,本文將為你介紹采集神器cURL的使用。

先給大家補(bǔ)充一下file_get_contents函數(shù)可以獲取遠(yuǎn)程鏈接數(shù)據(jù)的方法。

<?php$url = "http://git.oschina.net/yunluo/API/raw/master/notice.txt";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);$notice = curl_exec($ch);echo $notice;?>

這段代碼會(huì)直接使用curl顯示文件內(nèi)容,但是問題來了,因?yàn)閏url是php的擴(kuò)展,有的主機(jī)為了安全會(huì)金庸curl的,寧外php本地調(diào)試的時(shí)候也是關(guān)閉curl的,所以會(huì)發(fā)生報(bào)錯(cuò),所以這段代碼是不可取的,所以云落對(duì)他重新改寫了

<?php  if (function_exists('curl_init')) {    $url = "http://git.oschina.net/yunluo/API/raw/master/notice.txt";    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);    $dxycontent = curl_exec($ch);    echo $dxycontent;  } else {    echo '汗!貌似您的服務(wù)器尚未開啟curl擴(kuò)展,無法收到來自云落的通知,請(qǐng)聯(lián)系您的主機(jī)商開啟,本地調(diào)試請(qǐng)無視';  }?>

修改后的版本是對(duì)curl擴(kuò)展做一個(gè)判斷,看看服務(wù)器到底有木有打開curl擴(kuò)展,如果打開了,就直接顯示文件,如果沒打開就顯示一段提示文字。
雖然修復(fù)了問題,但是又有一個(gè)問題來了,我只是顯示一段文字而已,我也不是是用什么做什么大事的,所以我為什么要寫那么多的代碼呢??
經(jīng)過一些瞎掰的檢測(cè),發(fā)現(xiàn)file_get_contents獲取遠(yuǎn)程文件內(nèi)容的速度不比curl慢,在一些文件較少的情況下可能還比curl擴(kuò)展要快得多,所以我又重寫了代碼

<?php echo file_get_contents( "http://git.oschina.net/yunluo/API/raw/master/notice.txt" ); ?>

工具
火狐瀏覽器(FireFox) + Firebug
“工欲善其事,必先利其器。” 在分析案例之前,先讓我們學(xué)習(xí)一下如何利用神器Firebug獲取我們必要的信息。
使用F12打開Firebug,我們可以得到如圖(一)界面:

1、箭頭圖標(biāo)是“元素選擇”工具,單擊一次會(huì)高亮圖標(biāo),同時(shí),鼠標(biāo)在頁面內(nèi)的移動(dòng)會(huì)同時(shí)在HTML菜單中選定相應(yīng)的內(nèi)容,此時(shí)單擊內(nèi)容則表示選定了該元素,圖標(biāo)高亮取消。如圖(二)所示:
Firebug查看元素

php采集神器cURL使用方法詳解

2、控制臺(tái)
JS里面的console.log系列函數(shù)的打印就是在這里輸出。
3、HTML
HTML內(nèi)容,注意這里看到的不一定是采集要解析的內(nèi)容,采集時(shí)候?qū)?nèi)容的分析,一律以查看源碼(Ctrl+U)為準(zhǔn),這里只是能快速定位元素的結(jié)構(gòu),然后再選擇一個(gè)比較特殊的參照,在源碼中定位相應(yīng)的位置。
比如,你在HTML里面看到一個(gè)標(biāo)簽是<div id="demo" class="demo">Demo</div>,但是你查看源碼時(shí)候看到的內(nèi)容可能是<div class="demo" id="demo">Demo</div>,如果你對(duì)采集內(nèi)容按照前者去做正則匹配,那么你會(huì)得不到結(jié)果。
4、CSS
這里是CSS文件內(nèi)容
5、腳本
這里是Javascript文件內(nèi)容
6、DOM
Dom節(jié)點(diǎn)內(nèi)容
7、網(wǎng)絡(luò)
每一個(gè)請(qǐng)求鏈接的數(shù)據(jù),這里是我們采集要關(guān)注和分析的地方,它能夠顯示每一個(gè)請(qǐng)求的參數(shù)、請(qǐng)求頭、Cookie數(shù)據(jù)等。在頁面提交會(huì)刷新的情況下,需要使用保持,使得頁面請(qǐng)求內(nèi)容在刷新后仍然留著控制臺(tái)中,如圖(三)所示:

php采集神器cURL使用方法詳解

另外,火狐還有一款 Tamper data 擴(kuò)展也能得到請(qǐng)求數(shù)據(jù),必要時(shí)可以安裝使用。
8、Cookies
Cookie數(shù)據(jù)

在圖(一)中還看到下面有很多可選的小菜單項(xiàng),其中保持是我們要關(guān)注的,當(dāng)選擇它的時(shí)候,即使提交表單刷新了頁面,下面內(nèi)容區(qū)域的數(shù)據(jù)還是會(huì)保留,這個(gè)對(duì)于分析提交數(shù)據(jù)特別關(guān)鍵。

總結(jié)
我們?cè)诜治霾杉?qǐng)求的時(shí)候,主要關(guān)心“網(wǎng)絡(luò)”菜單里的請(qǐng)求數(shù)據(jù),必要時(shí)候使用“保持”以查看刷新頁面的請(qǐng)求數(shù)據(jù),請(qǐng)求前可以使用“清除”先清除下面的內(nèi)容。

案例解析
一、簡(jiǎn)單的采集
這里所指的簡(jiǎn)單采集,是指一個(gè)單一頁面GET請(qǐng)求的采集,它簡(jiǎn)單得即使通過file_get_contents函數(shù)也能輕松獲得頁面返回結(jié)果。

代碼片段之file_get_contents

<?php  $url = 'http://demo.zjmainstay.cn/php/curl/simple.html';  $content = file_get_contents($url);  echo $content;

代碼片段之cURL

<?php  $url = 'http://demo.zjmainstay.cn/php/curl/simple.html';  $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  $content = curl_exec($ch);          //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    echo $content;  

二、需要參數(shù)的采集
這種情況,頁面請(qǐng)求需要傳入一些參數(shù),可以是GET請(qǐng)求,也可以是POST請(qǐng)求。這種情況的采集,使用file_get_contents外帶一些參數(shù)還是可以實(shí)現(xiàn)的,但是這里我們將不再展示。

代碼片段之cURL GET
這種請(qǐng)求,我們可以選擇搜索引擎作為演示,比如我百度搜索一個(gè)詞語“PHP cURL”,在輸入回車后,我們會(huì)得到一個(gè)類似http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd=PHP%20cURL的鏈接,注意這里的鏈接可能不同瀏覽器、不同入口方式訪問得到不一樣結(jié)果,因此不必介意鏈接是否一樣。通過輸入多個(gè)關(guān)鍵詞并觀察鏈接,我們可以確定 wd 參數(shù)就是我們要傳入的動(dòng)態(tài)參數(shù),而其他參數(shù)則可以不變,因此得到我們下面的采集代碼。

<?php  $keyword  = 'PHP cURL';  $url    = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baidu&bar=&wd=' . urlencode($keyword);    $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  $content = curl_exec($ch);          //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    echo $content;

有些時(shí)候,一些參數(shù)并不是必須的,這時(shí)候我們可以刪掉它,比如上面的鏈接可以只保留http://www.baidu.com/s?ie=utf-8&wd=PHP%20cURL,ie=utf-8 這個(gè)參數(shù)可能影響結(jié)果的編碼,所以暫且留著它。就這樣簡(jiǎn)單的代碼,我們就可以采集到百度搜索的結(jié)果了。

代碼片段之cURL POST
對(duì)于POST類型的請(qǐng)求,我們平時(shí)并不少見,比如有些搜索就是使用POST方式提交,這時(shí)候我們就需要使用POST類型來提交參數(shù)了。這個(gè)在PHP cURL里面有相應(yīng)的參數(shù):CURLOPT_POST 和 CURLOPT_POSTFIELDS , CURLOPT_POST 的設(shè)置可以指定當(dāng)前提交是否為POST方式,CURLOPT_POSTFIELDS則用于設(shè)定提交的參數(shù),可以是參數(shù)串,也可以是參數(shù)數(shù)組,比如:

curl_setopt($ch, CURLOPT_POSTFIELDS, 'ie=utf-8&wd=PHP%20cURL');或curl_setopt($ch, CURLOPT_POSTFIELDS, array(  'ie'  => 'utf-8',  'wd'  => 'PHP%20cURL',));

下面是我做的一個(gè)POST模擬搜索PHP POST 搜索,后端是使用了前面的百度關(guān)鍵詞搜索,基本原理就是,客戶端提交一個(gè)關(guān)鍵詞到我服務(wù)器,我服務(wù)器使用該關(guān)鍵詞請(qǐng)求百度的搜索,然后得到結(jié)果,返回到客戶端。
如圖(四)是利用Firebug對(duì)請(qǐng)求數(shù)據(jù)的分析,得到我們需要提交的請(qǐng)求鏈接和請(qǐng)求參數(shù):

php采集神器cURL使用方法詳解

然后下面是我們的代碼:

<?php  $keyword  = 'PHP cURL';  //參數(shù)方法一  // $post    = 'wd=' . urlencode($keyword);    //參數(shù)方法二  $post    = array(    'wd'    => urlencode($keyword),  );  $url    = 'http://demo.zjmainstay.cn/php/curl/search.php';    $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  curl_setopt($ch, CURLOPT_POST, 1);      //發(fā)送POST類型數(shù)據(jù)  curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //POST數(shù)據(jù),$post可以是數(shù)組,也可以是拼接  $content = curl_exec($ch);          //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    var_dump($content);

三、需要Referer的采集
對(duì)于一些程序,它可能判斷來源網(wǎng)址,如果發(fā)現(xiàn)referer不是自己的網(wǎng)站,則拒絕訪問,這時(shí)候,我們就需要添加CURLOPT_REFERER參數(shù),模擬來路,使得程序能夠正常采集。

 

<?php  $keyword  = 'PHP cURL';  //參數(shù)方法一  // $post    = 'wd=' . urlencode($keyword);    //參數(shù)方法二  $post    = array(    'wd'    => urlencode($keyword),  );  $url    = 'http://demo.zjmainstay.cn/php/curl/search_refer.php';  $refer   = 'http://demo.zjmainstay.cn/';  //來路地址    $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  curl_setopt($ch, CURLOPT_REFERER, $refer);  //來路模擬  curl_setopt($ch, CURLOPT_POST, 1);      //發(fā)送POST類型數(shù)據(jù)  curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //POST數(shù)據(jù),$post可以是數(shù)組,也可以是拼接  $content = curl_exec($ch);          //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    var_dump($content);

search_refer.php的源碼如下,做了簡(jiǎn)單的Referer判斷攔截:

<?php  if(empty($_POST['wd'])) {    exit('Deny empty params.');  }    //Referer判斷  if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false) {    exit('Deny');  }    $keyword  = addslashes(trim(strip_tags($_POST['wd'])));  $url    = 'http://www.baidu.com/s?ie=utf-8&wd=' . urlencode($keyword);    $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  $content = curl_exec($ch);          //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    echo $content; 

四、需要cookie支持的采集
對(duì)于模擬登錄的應(yīng)用,單單提交參數(shù)和模擬來路并不能解決問題,這時(shí)候我們就需要保存或者提交相應(yīng)的Cookie參數(shù),這個(gè)在PHP cURL里面也提供了相應(yīng)的參數(shù):
CURLOPT_COOKIE: 直接使用字符串方式提交cookie參數(shù)
CURLOPT_COOKIEFILE: 使用文件方式提交cookie參數(shù)
CURLOPT_COOKIEJAR: 保存提交后反饋的cookie數(shù)據(jù)

下面是PHP100的模擬登錄示例:

 

<?php header("content-Type: text/html; charset=UTF-8");$cookie_file = tempnam('./temp', 'cookie');$login_url="http://bbs.php100.com/login.php";$post_fields="cktime=36000&step=2&pwuser=username&pwpwd=password";//提交登錄表單請(qǐng)求$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); //存儲(chǔ)提交后得到的cookie數(shù)據(jù)curl_exec($ch);curl_close($ch);//登錄成功后,獲取bbs首頁數(shù)據(jù)$url="http://bbs.php100.com/index.php";$ch=curl_init($url);curl_setopt($ch,CURLOPT_HEADER,0);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file); //使用提交后得到的cookie數(shù)據(jù)做參數(shù)$contents=curl_exec($ch);curl_close($ch);//轉(zhuǎn)碼顯示echo iconv('gbk', 'UTF-8', $contents);

五、壓縮網(wǎng)頁采集(gzip)
有些沒有接觸過壓縮頁面的朋友估計(jì)會(huì)在這里被坑死,因?yàn)樗麄儠?huì)發(fā)現(xiàn)采集回來的內(nèi)容是亂碼,并且無論使用iconv還是強(qiáng)大的mb_convert_encoding都無法還原數(shù)據(jù),然后又沒有概念,各種抓狂卻找不到方法,哈哈,我曾經(jīng)也是這樣~
如圖(五)是亂碼表現(xiàn)形式:

php采集神器cURL使用方法詳解

還好最后功夫不負(fù)有心人,還是找到了,它就是CURLOPT_ENCODING參數(shù)。
比如,采集搜狐的新聞時(shí)候就遇到gzip壓縮問題,下面是示例:

<?php  $url = 'http://news.sohu.com/';    $ch = curl_init($url);  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回?cái)?shù)據(jù)不直接輸出  curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip壓縮  $content = curl_exec($ch); //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);  echo $content;

手冊(cè)說明:支持的編碼有"identity","deflate"和"gzip"。如果為空字符串"",請(qǐng)求頭會(huì)發(fā)送所有支持的編碼類型。
后面一句表明,使用curl_setopt($ch, CURLOPT_ENCODING, "");也是可以的,但是不能不加這個(gè)參數(shù)。

六、SSL鏈接的采集
有些請(qǐng)求鏈接是https類型的,這時(shí)候使用cURL采集可能會(huì)失敗,這時(shí)候,我們可以使用 var_dump(curl_error($ch));的方法打印錯(cuò)誤提示,然后根據(jù)錯(cuò)誤提示查找相應(yīng)的解決方案。比如SSL錯(cuò)誤常見提示:SSL certificate problem: unable to get local issuer certificate,這時(shí)候,我們就需要利用參數(shù):CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 來禁用SSL證書的驗(yàn)證,我嘗試過只使用CURLOPT_SSL_VERIFYPEER參數(shù)禁用失敗,所以大家最好同時(shí)使用兩個(gè)參數(shù)。
下面是代碼示例:

 

<?php  $searchStr = 'RC376981638HK';  $post  = 'accion=LocalizaUno&numero='.$searchStr.'&ecorreo=&numeros=';  $url  = 'https://aplicacionesweb.correos.es/localizadorenvios/track.asp';  $ch         = curl_init($url);       //初始化curl  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    //返回?cái)?shù)據(jù)不直接輸出  curl_setopt($ch, CURLOPT_POST, 1);         //發(fā)送POST類型數(shù)據(jù)  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);    //POST數(shù)據(jù),$post可以是數(shù)組,也可以是拼接參數(shù)串  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //SSL 報(bào)錯(cuò)時(shí)使用  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  //SSL 報(bào)錯(cuò)時(shí)使用  $contents = curl_exec($ch);               //執(zhí)行并存儲(chǔ)結(jié)果  // var_dump(curl_error($ch));            //獲取失敗是使用(采集錯(cuò)誤提示)  curl_close($ch);  echo $contents;

七、代理采集
大家都知道,國內(nèi)存在萬惡的墻,所以,假如我們需要獲取某些被墻數(shù)據(jù)時(shí),就需要用到國外代理服務(wù)器;又或者我們需要采集大量數(shù)據(jù)時(shí),需要不斷切換IP,也會(huì)用到代理。
使用代理在PHP cURL里面有幾個(gè)相對(duì)應(yīng)的參數(shù):CURLOPT_PROXY、CURLOPT_PROXYPORT 和 CURLOPT_PROXYUSERPWD,還有另外幾個(gè),這里不列舉。
CURLOPT_PROXY 指定代理IP參數(shù)
CURLOPT_PROXYPORT 指定代理端口參數(shù)
CURLOPT_PROXYUSERPWD 指定需要驗(yàn)證的代理的賬號(hào)密碼,"[username]:[password]"格式的字符串

關(guān)于代理賬號(hào)獲取,大家自己發(fā)揮,我這里提供網(wǎng)上搜索到的一個(gè)列表:cURL 高匿代理

下面是代理采集示例:

 

<?php  $url = 'http://demo.zjmainstay.cn/php/curl/dump_ip.php?t=' . time();    echo "本地IP:" . file_get_contents($url) . "/n偽造IP:";    $ip   = '183.224.1.116';  $port  = '80';    //偽造請(qǐng)求頭參數(shù),如果是高匿代理這里不需要提供  $header = array(    'X-FORWARDED-FOR: ' . $ip,    'CLIENT-IP: ' . $ip,  );    $ch         = curl_init($url); //初始化curl  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  curl_setopt($ch, CURLOPT_PROXY, $ip);  curl_setopt($ch, CURLOPT_PROXYPORT, $port);  $content = curl_exec($ch); //執(zhí)行并存儲(chǔ)結(jié)果  curl_close($ch);    echo $content;

八、 多線程采集
對(duì)于大量采集工作,為了提高采集效率,使用PHP cURL提供的多線程采集是必不可少的。手冊(cè)上提供的多線程采集例子好像都不太好用,我剛開始也從里面測(cè)試了幾個(gè)例子,但是發(fā)現(xiàn)都是執(zhí)行卡死,根本無法執(zhí)行完成,前幾天突然又測(cè)試了一下,然后發(fā)現(xiàn)curl_multi_info_read函數(shù)下面的Example #1是可以執(zhí)行的,它的內(nèi)容在$res上,但是沒有打印出來,而且雅虎的請(qǐng)求比較慢,會(huì)卡住,前面兩個(gè)鏈接都能正常返回。
不過,還好當(dāng)時(shí)的例子不好用,然后我經(jīng)過搜索找到了一個(gè)很厲害的項(xiàng)目,CurlMulti ,它對(duì)PHP cURL Multi 進(jìn)行了一個(gè)良性擴(kuò)展的封裝,能夠很好地提供采集支持。
關(guān)于CurlMulti的使用我就不多介紹,官網(wǎng)上面提供了demo,使用過程有技術(shù)難題可以直接加入Q群討論,作者@Ares 和其他的采集大牛都會(huì)提供技術(shù)解答幫助。
下面是PHP cURL Multi的一個(gè)簡(jiǎn)單示例:

 

<?php$urls = array(  "http://demo.zjmainstay.cn/php/curl/curl_multi_1.php",  "http://demo.zjmainstay.cn/php/curl/curl_multi_2.php",);$mh = curl_multi_init();foreach ($urls as $i => $url) {  $conn[$i] = curl_init($url);  curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1); //不直接輸出結(jié)果  curl_multi_add_handle($mh, $conn[$i]);}$active = null;$res = array();do {  $status = curl_multi_exec($mh, $active);  $info = curl_multi_info_read($mh);  if (false !== $info) {    //采集信息處理    $res[] = array(      'content'  => curl_multi_getcontent($info['handle']),      'info'   => $info,    );    curl_close($info['handle']);  }} while ($status === CURLM_CALL_MULTI_PERFORM || $active);curl_multi_close($mh);var_dump($res);

九、302跳轉(zhuǎn)(301跳轉(zhuǎn))
對(duì)于一些應(yīng)用,比如模擬登錄,如果遇上302跳轉(zhuǎn),會(huì)導(dǎo)致cookie丟失而使得模擬登錄失敗,請(qǐng)求現(xiàn)象如圖(六)所示:

php采集神器cURL使用方法詳解

這個(gè)時(shí)候,可以使用:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

關(guān)于CURLOPT_FOLLOWLOCATION,手冊(cè)說明是:

啟用時(shí)會(huì)將服務(wù)器服務(wù)器返回的"Location: "放在header中遞歸的返回給服務(wù)器,使用CURLOPT_MAXREDIRS可以限定遞歸返回的數(shù)量。
我個(gè)人理解,通俗點(diǎn)講就是后面的跳轉(zhuǎn)會(huì)繼續(xù)跟蹤訪問,而且cookie在header里面被保留了下來。

十、模擬上傳文件
在PHP手冊(cè)的curl_setopt函數(shù)中,關(guān)于CURLOPT_POSTFIELDS有如下描述:

全部數(shù)據(jù)使用HTTP協(xié)議中的"POST"操作來發(fā)送。要發(fā)送文件,在文件名前面加上@前綴并使用完整路徑。這個(gè)參數(shù)可以通過urlencoded后的字符串類似'para1=val1¶2=val2&...'或使用一個(gè)以字段名為鍵值,字段數(shù)據(jù)為值的數(shù)組。如果value是一個(gè)數(shù)組,Content-Type頭將會(huì)被設(shè)置成multipart/form-data。

對(duì)于上傳文件,這句話包含兩個(gè)信息:

1. 要上傳文件,post的數(shù)據(jù)參數(shù)必須使用數(shù)組,使得Content-Type頭將會(huì)被設(shè)置成multipart/form-data。
2. 要上傳文件,在文件名前面加上@前綴并使用完整路徑。
因此,模擬文件上傳可以按照如下實(shí)現(xiàn):

//上傳D盤下的test.jpg文件,文件必須存在,否則curl處理失敗且沒有任何提示$data = array('name' => 'Foo', 'file' => '@d:/test.jpg');$ch = curl_init('http://localhost/upload.php');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_exec($ch);

本地測(cè)試的時(shí)候,在upload.php文件中打印出//(_POST和/$_FILES即可驗(yàn)證是否上傳成功,如下: ``` <?php print_r(/)_POST);
print_r($_FILES);

輸出結(jié)果類似:

Array ( [name] => Foo ) Array ( [file] => Array ( [name] => test.jpg [type] => application/octet-stream [tmp_name] => D:/xampp/tmp/php2EA0.tmp [error] => 0 [size] => 139999 ) )

關(guān)于CURLOPT_POSTFIELDS的賦值,另外補(bǔ)充一句描述:
傳遞一個(gè)數(shù)組到CURLOPT_POSTFIELDS,cURL會(huì)把數(shù)據(jù)編碼成 multipart/form-data,而然傳遞一個(gè)URL-encoded字符串時(shí),數(shù)據(jù)會(huì)被編碼成 application/x-www-form-urlencoded。

即:

curl_setopt(/(ch, CURLOPT_POSTFIELDS, 'param1=val1¶m2=val2&...'); 和 curl_setopt(/)ch, CURLOPT_POSTFIELDS, array('param1' => 'val1', 'param2' => 'val2', ...));

這樣一個(gè)功能強(qiáng)大的采集神器cURL的使用方法為大家介紹到這,希望對(duì)大家的學(xué)習(xí)有所幫助。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
秋霞午夜av一区二区三区| 麻豆中文一区二区| 亚洲第一av在线| 国产精品色呦| 午夜精品久久久久久久蜜桃app| 久久婷婷国产91天堂综合精品| 国产绿帽一区二区三区| 最近日韩中文字幕中文| 亚洲欧美日韩三级| 625成人欧美午夜电影| 日韩欧美一二三| 欧美韩日一区二区| 天堂av中文在线资源库| 一区二区不卡在线视频 午夜欧美不卡在| 好吊一区二区三区| 亚洲丰满少妇videoshd| 亚洲精品女人久久久| 欧美少妇另类| 亚洲天堂成人在线视频| 一级中文字幕一区二区| 亚洲精品美女视频| 亚洲国产精品视频| 播九公社成人综合网站| 欧美日韩成人免费| 97色成人综合网站| 91精品国产综合久久香蕉的特点| 日韩高清在线播放| 樱桃视频在线观看一区| 欧美国产日韩在线视频| 91精品国产高清91久久久久久| 美国av免费观看| 欧美在线在线| 国产sm主人调教女m视频| 天干夜天天夜天干天ww| 日韩污视频在线观看| 色先锋资源久久综合5566| 久久影院午夜论| 五月婷婷激情综合网| 久久深夜福利| 日韩高清国产一区在线| 国产精品一二一区| 国产一级特黄a大片免费| 国产精品天干天干在观线| 国内精品嫩模av私拍在线观看| 亚洲国产精品毛片av不卡在线| 欧美精品三级在线观看| 在线视频日韩一区| v8888av| 久久精品色综合| 免费av网站观看| 好男人中文字幕官网| 久久久久久蜜桃一区二区| 成人高潮视频| 97免费视频在线| 国产精品麻豆久久久| 国产又大又黄又粗的视频| 蜜臀一区二区三区精品免费视频| 美国黄色特级片| 国产一精品一av一免费爽爽| 亚洲天堂开心观看| 成人网在线免费观看| 国产成人精品免费看| 偷拍自拍在线| 91久久精品在线| 亚洲美女av在线播放| 99成人超碰| 午夜视频在线观| 日韩精品一区二区三区在线播放| 在线观看无遮挡| 亚洲18女电影在线观看| 久久久91精品国产一区二区精品| 欧美福利视频| 亚洲大胆人体视频| 欧美日韩性视频在线| 看女生喷水的网站在线观看| 亚洲日本va午夜在线影院| jizzjizzjizz中国免费| 国产精品爱啪在线线免费观看| 2021天天操| 国产精品爱久久久久久久小说| 亚洲欧美日本一区二区三区| 精品免费二区三区三区高中清不卡| 91精品久久久久久久久久久久| 国产91九色蝌蚪| 国产不卡一卡2卡三卡4卡5卡在线| 大胆av不用播放器在线播放| 水野朝阳av一区二区三区| 国产亚洲精品v| 日本二区在线观看| 视频1区2区3区| av资源一区二区| 国产伦精品一区| 国产在线精品一区二区三区》| 欧美波霸videosex极品| 亚洲美女啪啪| 一本精品一区二区三区| 免费日本一区二区三区视频| 中国女人一级毛片| 欧洲视频一区二区三区| 91国产美女视频| 中文字幕欧美日韩在线| 亚洲精品国产高清久久伦理二区| 欧美在线一卡| 日韩日韩日韩日韩日韩| 欧美午夜片在线观看| 欧美一区二区三区免费在线看| 啊啊啊啊啊啊啊视频在线播放| 唐人社导航福利精品| 国内精品不卡一区二区三区| 欧美一区二区三区不卡视频| 国产日产精品久久久久久婷婷| 国产精品丝袜久久久久久不卡| 国产制服91一区二区三区制服| 久久在精品线影院精品国产| 日韩成人在线观看| 成人av免费网站| 狠狠鲁男人天堂| 蜜臀视频在线观看| 免费在线视频一区二区| 欧美xxxxxxxxx59| 香蕉视频国产精品| 国产国产国产国产国产国产| 一本色道久久综合| 欧美极品色图| 国产精品精品| 欧美一区二区三区在线免费观看| 高清一区二区三区av| 亚洲色图都市激情| 亚洲第五色综合网| 五月天婷婷激情网| 国产精品久久久久影视| 国产成人免费av一区二区午夜| 亚洲一区av在线播放| 欧美熟妇精品黑人巨大一二三区| 天堂综合在线播放| 婷婷五月综合缴情在线视频| 毛片不卡一区二区| 亚洲欧美日韩动漫| 人与牲动交xxxxbbbb高清| 一级片一级片一级片| 中日韩男男gay无套| 在线精品国精品国产尤物884a| av天堂永久资源网| 国产免费观看久久黄| 免费观看黄色av| a级片免费观看| 欧美激情中文字幕在线| 日韩免费特黄一二三区| 已婚少妇美妙人妻系列| 日本视频在线免费| 美女网站在线观看| 国产二区精品| 久久精品女人天堂av免费观看| 欧美黑人猛猛猛| 久久久亚洲欧洲日产国码aⅴ| caoporen国产精品视频| 欧美高跟鞋交xxxxhd| 欧美三级中文字| 欧美激情videoshd| 一区二区在线免费观看视频| 91丨九色丨海角社区| 四虎国产成人精品免费一女五男| 天天爽夜夜爽一区二区三区| 亚洲精品在线二区| 中文字幕久久av| 91视视频在线直接观看在线看网页在线看| 日韩三区在线观看| 亚洲影院中文字幕| 中文在线8资源库| 久久久久亚洲av成人网人人软件| 亚洲成人中文字幕在线| 波多野结衣一区二区| 成人国产视频在线| 黄色av一区二区三区| 久久久久久无码精品人妻一区二区| 在线观看欧美| 国产免费久久| 国产乱理伦片在线观看夜一区| 欧美色网在线| 欧美aaaaa喷水| av小次郎在线| 国产日产精品一区二区三区的介绍| 欧美大片欧美激情性色a∨久久| 国产精品第二页| 国产资源一区| 国产精品中文字幕一区二区三区| 羞羞免费视频网站| 国产精品二线| 懂色一区二区三区av片| 日韩av综合中文字幕| 在线免费观看日本一区| 国产乱对白刺激视频不卡| 六月婷婷综合网| 午夜精品久久久久久久96蜜桃| 欧美一区二区三区在线观看免费| 国产精品久久久久毛片软件| 亚洲美女黄色| 日韩精品久久久久久免费| 国产精品久久久久久久9999| www视频免费看| 男女啪啪网站视频| 国产精品视频一区二区三区综合| 亚洲va韩国va欧美va精四季| 国产在线观看黄色| 中文字幕日韩第一页| 亚州精品视频| 天天干天天爽| 色综合影院在线观看| 日韩影片在线播放| 青草青草久热精品视频在线网站| 日本中文字幕片| 国产拍揄自揄精品视频麻豆| 亚洲日本高清| 日韩在线免费观看视频| 欧美黑人xxxxx| 中文综合在线观看| 四虎4545www精品视频| 国产国产人免费人成免费视频| 麻豆成全视频免费观看在线看| 高清av一区| 91豆花视频在线播放| 精品国自产在线观看| 亚洲乱码精品久久久久..| 中文字幕字幕中文在线中不卡视频| 精品久久久久久亚洲精品| 波多野结衣50连登视频| 18岁成年人网站| 5566日本婷婷色中文字幕97| 一本色道久久综合亚洲精品不卡| 精品国产成人av| 女人被狂躁c到高潮| 一区二区三区免费在线观看视频| 国产精品无码99re| 欧美超强性xxxxx| 亚洲专区一区二区三区| 色999日韩自偷自拍美女| 99麻豆久久久国产精品免费| 亚洲精品国产动漫| 日韩视频在线一区| 超碰在线无需免费| 中文产幕区在线观看| 下面一进一出好爽视频| 欧美一区二区三区激情| www.天天射.com| 欧美日韩一区二区免费视频| 国内精品在线视频| 国产精品视频一区二区三区麻豆| 视频在线这里都是精品| 欧美做受喷浆在线观看| 国产真实夫妇交换视频| 日本成人在线视频网址| 国产精品久久久久久久久晋中| 久久久国产精品| 亚洲精品狠狠操| 香蕉精品视频在线观看| 少妇视频在线观看| xxxx 国产| 午夜精品久久| 在线欧美日韩国产| 亚洲国产精华液网站w| 中文无码久久精品| 精品xxxxxbbbb欧美中文| 欧美性猛交xxxx黑人猛交| 一区二区三区 在线观看视| 黄网在线免费| 亚洲国产日本| 成熟亚洲日本毛茸茸凸凹| 欧美伦理片在线观看| 91精品国产乱码久久蜜臀| 成年人黄国产| 麻豆传媒在线视频| 日韩亚洲欧美一区| 一区二区中文字幕在线观看| 免费黄色网址在线观看| xxxx日本免费| 国产又黄又猛又粗又爽的视频| 国产一区二区影视| 精品视频资源站| 激情av综合网| 国产特级黄色片| 亚洲丁香久久久| 四季av中文字幕| 欧美在线观看一区二区| 亚洲精品视频免费在线观看| 在线看片成人| 久操视频在线观看免费| 国产二区视频| 国产综合色产在线精品| 国产精品午夜视频| 97se狠狠狠综合亚洲狠狠| 日韩精品在线视频免费观看| 亚洲成人日韩在线| 欧美重口另类| 色噜噜一区二区三区| 黄页免费欧美| 国产成人免费视频精品含羞草妖精| 强制捆绑调教一区二区| 亚洲欧美偷拍三级| 中文字幕在线观看你懂的| 精品国产一区二区三区久久影院| 亚洲国产综合在线| 特一级黄色大片| 欧美日韩一区二区三区在线免费观看| 国产成人综合视频| 97人妻天天摸天天爽天天| 久久狠狠一本精品综合网| 国产伦精品一区二区三区精品视频| 一级全黄肉体裸体全过程| av激情亚洲男人天堂| 免费中文字幕在线观看| 国产中文字幕免费| 日韩欧美国产不卡| 美女免费视频网站| 三上亚洲一区二区| 日日碰狠狠丁香久燥| 欧美老肥妇做.爰bbww| 久久亚洲精品小早川怜子66| 亚洲综合视频网| 色天使在线观看| 顶级嫩模精品视频在线看| 老鸭窝一区二区久久精品| 成年人深夜视频| 另类视频在线观看| 麻豆视频传媒入口| 国产制服91一区二区三区制服| 欧美一区二区三区免费视| 亚洲最大成人在线观看| 国产自产v一区二区三区c|