因?yàn)?,PHP CURL庫默認(rèn)1024字節(jié)的長(zhǎng)度不等待數(shù)據(jù)的返回,所以你那段代碼需增加一項(xiàng)配置:
成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為銅梁等服務(wù)建站,銅梁等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為銅梁企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
給你一個(gè)更全面的封裝方法:
function req_curl($url, $status = null, $options = array())
{
$res = '';
$options = array_merge(array(
'follow_local' = true,
'timeout' = 30,
'max_redirects' = 4,
'binary_transfer' = false,
'include_header' = false,
'no_body' = false,
'cookie_location' = dirname(__FILE__) . '/cookie',
'useragent' = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
'post' = array() ,
'referer' = null,
'ssl_verifypeer' = 0,
'ssl_verifyhost' = 0,
'headers' = array(
'Expect:'
) ,
'auth_name' = '',
'auth_pass' = '',
'session' = false
) , $options);
$options['url'] = $url;
$s = curl_init();
if (!$s) return false;
curl_setopt($s, CURLOPT_URL, $options['url']);
curl_setopt($s, CURLOPT_HTTPHEADER, $options['headers']);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, $options['ssl_verifypeer']);
curl_setopt($s, CURLOPT_SSL_VERIFYHOST, $options['ssl_verifyhost']);
curl_setopt($s, CURLOPT_TIMEOUT, $options['timeout']);
curl_setopt($s, CURLOPT_MAXREDIRS, $options['max_redirects']);
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, $options['follow_local']);
curl_setopt($s, CURLOPT_COOKIEJAR, $options['cookie_location']);
curl_setopt($s, CURLOPT_COOKIEFILE, $options['cookie_location']);
if (!empty($options['auth_name']) is_string($options['auth_name']))
{
curl_setopt($s, CURLOPT_USERPWD, $options['auth_name'] . ':' . $options['auth_pass']);
}
if (!empty($options['post']))
{
curl_setopt($s, CURLOPT_POST, true);
curl_setopt($s, CURLOPT_POSTFIELDS, $options['post']);
//curl_setopt($s, CURLOPT_POSTFIELDS, array('username' = 'aeon', 'password' = '111111'));
}
if ($options['include_header'])
{
curl_setopt($s, CURLOPT_HEADER, true);
}
if ($options['no_body'])
{
curl_setopt($s, CURLOPT_NOBODY, true);
}
if ($options['session'])
{
curl_setopt($s, CURLOPT_COOKIESESSION, true);
curl_setopt($s, CURLOPT_COOKIE, $options['session']);
}
curl_setopt($s, CURLOPT_USERAGENT, $options['useragent']);
curl_setopt($s, CURLOPT_REFERER, $options['referer']);
$res = curl_exec($s);
$status = curl_getinfo($s, CURLINFO_HTTP_CODE);
curl_close($s);
return $res;
}
有以下幾種可能:
1、服務(wù)器端確實(shí)沒有數(shù)據(jù)返回;
2、curl寫錯(cuò)了;
3、試試下面這個(gè),我在用的
function?curl($url,$post?=?'POST',$data?=?array()){
$ch?=?curl_init();
$headers[]?=?"Accept-Charset:?utf-8";
curl_setopt($ch,?CURLOPT_URL,?$url);
curl_setopt($ch,?CURLOPT_CUSTOMREQUEST,?$post);
curl_setopt($ch,?CURLOPT_POSTFIELDS,?$data);
curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?FALSE);
curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?FALSE);
curl_setopt($ch,?CURLOPT_SSLVERSION,?1);
curl_setopt($ch,?CURLOPT_HTTPHEADER,?$headers);
curl_setopt($ch,?CURLOPT_USERAGENT,?'Mozilla/5.0?(compatible;?MSIE?5.01;?Windows?NT?5.0)');
curl_setopt($ch,?CURLOPT_FOLLOWLOCATION,?1);
curl_setopt($ch,?CURLOPT_AUTOREFERER,?1);
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?true);
$result?=?curl_exec($ch);
curl_close($ch);
return?json_decode($result,1);
}
oCurl?=?curl_init();
//?設(shè)置請(qǐng)求頭
$header[]?=?"Content-type:?application/x-www-form-urlencoded";
$user_agent?=?"Mozilla/5.0?(Windows?NT?6.1)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/33.0.1750.146?Safari/537.36";
curl_setopt($oCurl,?CURLOPT_URL,?$sUrl);
curl_setopt($oCurl,?CURLOPT_HTTPHEADER,$header);
//?返回?response_header,?該選項(xiàng)非常重要,如果不為?true,?只會(huì)獲得響應(yīng)的正文
curl_setopt($oCurl,?CURLOPT_HEADER,?true);
//?是否不需要響應(yīng)的正文,為了節(jié)省帶寬及時(shí)間,在只需要響應(yīng)頭的情況下可以不要正文
curl_setopt($oCurl,?CURLOPT_NOBODY,?true);
//?使用上面定義的?ua
curl_setopt($oCurl,?CURLOPT_USERAGENT,$user_agent);
curl_setopt($oCurl,?CURLOPT_RETURNTRANSFER,?1?);
//?不用?POST?方式請(qǐng)求,?意思就是通過?GET?請(qǐng)求
curl_setopt($oCurl,?CURLOPT_POST,?false);
$sContent?=?curl_exec($oCurl);
//?獲得響應(yīng)結(jié)果里的:頭大小
$headerSize?=?curl_getinfo($oCurl,?CURLINFO_HEADER_SIZE);
//?根據(jù)頭大小去獲取頭信息內(nèi)容
$header?=?substr($sContent,?0,?$headerSize);
curl_close($oCurl);
使用PHP的cURL庫可以簡(jiǎn)單和有效地去抓網(wǎng)頁 你只需要運(yùn)行一個(gè)腳本 然后分析一下你所抓取的網(wǎng)頁 然后就可以以程序的方式得到你想要的數(shù)據(jù)了 無論是你想從從一個(gè)鏈接上取部分?jǐn)?shù)據(jù) 或是取一個(gè)XML文件并把其導(dǎo)入數(shù)據(jù)庫 那怕就是簡(jiǎn)單的獲取網(wǎng)頁內(nèi)容 cURL 是一個(gè)功能強(qiáng)大的PHP庫 本文主要講述如果使用這個(gè)PHP庫
啟用 cURL 設(shè)置
首先 我們得先要確定我們的PHP是否開啟了這個(gè)庫 你可以通過使用php_info()函數(shù)來得到這一信息
﹤?phpphpinfo();?﹥
如果你可以在網(wǎng)頁上看到下面的輸出 那么表示cURL庫已被開啟
如果你看到的話 那么你需要設(shè)置你的PHP并開啟這個(gè)庫 如果你是在Windows平臺(tái)下 那么非常簡(jiǎn)單 你需要改一改你的php ini文件的設(shè)置 找到php_curl dll 并取消前面的分號(hào)注釋就行了 如下所示
//取消下在的注釋extension=php_curl dll
如果你是在Linux下面 那么 你需要重新編譯你的PHP了 編輯時(shí) 你需要打開編譯參數(shù)——在configure命令上加上 –with curl 參數(shù)
一個(gè)小示例
如果一切就緒 下面是一個(gè)小例程
﹤?php// 初始化一個(gè) cURL 對(duì)象$curl = curl_init();
// 設(shè)置你需要抓取的URLcurl_setopt($curl CURLOPT_URL //cocre );
// 設(shè)置headercurl_setopt($curl CURLOPT_HEADER );
// 設(shè)置cURL 參數(shù) 要求結(jié)果保存到字符串中還是輸出到屏幕上 curl_setopt($curl CURLOPT_RETURNTRANSFER );
// 運(yùn)行cURL 請(qǐng)求網(wǎng)頁$data = curl_exec($curl);
// 關(guān)閉URL請(qǐng)求curl_close($curl);
// 顯示獲得的數(shù)據(jù)var_dump($data);
如何POST數(shù)據(jù)
上面是抓取網(wǎng)頁的代碼 下面則是向某個(gè)網(wǎng)頁P(yáng)OST數(shù)據(jù) 假設(shè)我們有一個(gè)處理表單的網(wǎng)址// example /sendSMS php 其可以接受兩個(gè)表單域 一個(gè)是電話號(hào)碼 一個(gè)是短信內(nèi)容
﹤?php$phoneNumber = ;$message = This message was generated by curl and php ;$curlPost = pNUMBER= urlencode($phoneNumber) MESSAGE= urlencode($message) SUBMIT=Send ;$ch = curl_init();curl_setopt($ch CURLOPT_URL // example /sendSMS php );curl_setopt($ch CURLOPT_HEADER );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_POST );curl_setopt($ch CURLOPT_POSTFIELDS $curlPost);$data = curl_exec();curl_close($ch);?﹥
從上面的程序我們可以看到 使用CURLOPT_POST設(shè)置HTTP協(xié)議的POST方法 而不是GET方法 然后以CURLOPT_POSTFIELDS設(shè)置POST的數(shù)據(jù)
關(guān)于代理服務(wù)器
下面是一個(gè)如何使用代理服務(wù)器的示例 請(qǐng)注意其中高亮的代碼 代碼很簡(jiǎn)單 我就不用多說了
﹤?php $ch = curl_init();curl_setopt($ch CURLOPT_URL // example );curl_setopt($ch CURLOPT_HEADER );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_HTTPPROXYTUNNEL );curl_setopt($ch CURLOPT_PROXY fakeproxy : );curl_setopt($ch CURLOPT_PROXYUSERPWD user:password );$data = curl_exec();curl_close($ch);?﹥ 關(guān)于SSL和Cookie
關(guān)于SSL也就是HTTPS協(xié)議 你只需要把CURLOPT_URL連接中的//變成//就可以了 當(dāng)然 還有一個(gè)參數(shù)叫CURLOPT_SSL_VERIFYHOST可以設(shè)置為驗(yàn)證站點(diǎn)
關(guān)于Cookie 你需要了解下面三個(gè)參數(shù)
CURLOPT_COOKIE 在當(dāng)面的會(huì)話中設(shè)置一個(gè)cookie
CURLOPT_COOKIEJAR 當(dāng)會(huì)話結(jié)束的時(shí)候保存一個(gè)Cookie
CURLOPT_COOKIEFILE Cookie的文件
HTTP服務(wù)器認(rèn)證
最后 我們來看一看HTTP服務(wù)器認(rèn)證的情況
﹤?php $ch = curl_init();curl_setopt($ch CURLOPT_URL // example );curl_setopt($ch CURLOPT_RETURNTRANSFER );curl_setopt($ch CURLOPT_HTTPAUTH CURLAUTH_BASIC);curl_setopt(CURLOPT_USERPWD [username]:[password] )
$data = curl_exec();curl_close($ch);?﹥
關(guān)于其它更多的內(nèi)容 請(qǐng)參看相關(guān)的cURL手冊(cè) lishixinzhi/Article/program/PHP/201311/21491
PHP的curl()在抓取網(wǎng)頁的效率方面是比較高的,而且支持多線程,而file_get_contents()效率就要稍低些,當(dāng)然,使用curl時(shí)需要開啟下curl擴(kuò)展。
代碼實(shí)戰(zhàn)
先來看登錄部分的代碼:
//模擬登錄
function
login_post($url,
$cookie,
$post)
{
$curl
=
curl_init();//初始化curl模塊
curl_setopt($curl,
CURLOPT_URL,
$url);//登錄提交的地址
curl_setopt($curl,
CURLOPT_HEADER,
0);//是否顯示頭信息
curl_setopt($curl,
CURLOPT_RETURNTRANSFER,
0);//是否自動(dòng)顯示返回的信息
curl_setopt($curl,
CURLOPT_COOKIEJAR,
$cookie);
//設(shè)置Cookie信息保存在指定的文件中
curl_setopt($curl,
CURLOPT_POST,
1);//post方式提交
curl_setopt($curl,
CURLOPT_POSTFIELDS,
http_build_query($post));//要提交的信息
curl_exec($curl);//執(zhí)行cURL
curl_close($curl);//關(guān)閉cURL資源,并且釋放系統(tǒng)資源
}
函數(shù)login_post()首先初始化curl_init(),然后使用curl_setopt()設(shè)置相關(guān)選項(xiàng)信息,包括要提交的url地址,保存的cookie文件,post的數(shù)據(jù)(用戶名和密碼等信息),是否返回信息等等,然后curl_exec執(zhí)行curl,最后curl_close()釋放資源。注意PHP自帶的http_build_query()可以將數(shù)組轉(zhuǎn)換成相連接的字符串。
接下來如果登錄成功后,我們要獲取登錄成功后的頁面信息。
//登錄成功后獲取數(shù)據(jù)
function
get_content($url,
$cookie)
{
$ch
=
curl_init();
curl_setopt($ch,
CURLOPT_URL,
$url);
curl_setopt($ch,
CURLOPT_HEADER,
0);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER,
1);
curl_setopt($ch,
CURLOPT_COOKIEFILE,
$cookie);
//讀取cookie
$rs
=
curl_exec($ch);
//執(zhí)行cURL抓取頁面內(nèi)容
curl_close($ch);
return
$rs;
}
函數(shù)get_content()中也是先初始化curl,然后設(shè)置相關(guān)選項(xiàng),執(zhí)行curl,釋放資源。其中我們?cè)O(shè)置CURLOPT_RETURNTRANSFER為1即自動(dòng)返回信息,而CURLOPT_COOKIEFILE可以讀取到登錄時(shí)保存的cookie信息,最后將頁面內(nèi)容返回。
我們的最終目的是要獲取到模擬登錄后的信息,也就是只有正常登錄成功后才能獲取的有用信息。接下來我們以登錄開源中國的移動(dòng)版為例,看看如何抓取到登錄成功后的信息。
//設(shè)置post的數(shù)據(jù)
$post
=
array
(
'email'
=
'oschina賬戶',
'pwd'
=
'oschina密碼',
'goto_page'
=
'/my',
'error_page'
=
'/login',
'save_login'
=
'1',
'submit'
=
'現(xiàn)在登錄'
);
//登錄地址
$url
=
"";
//設(shè)置cookie保存路徑
$cookie
=
dirname(__FILE__)
.
'/cookie_oschina.txt';
//登錄后要獲取信息的地址
$url2
=
"";
//模擬登錄
login_post($url,
$cookie,
$post);
//獲取登錄頁的信息
$content
=
get_content($url2,
$cookie);
//刪除cookie文件
@
unlink($cookie);
//匹配頁面信息
$preg
=
"/td
class='portrait'(.*)\/td/i";
preg_match_all($preg,
$content,
$arr);
$str
=
$arr[1][0];
//輸出內(nèi)容
echo
$str;
使用總結(jié)
1、初始化curl;
2、使用curl_setopt設(shè)置目標(biāo)url,和其他選項(xiàng);
3、curl_exec,執(zhí)行curl;
4、執(zhí)行后,關(guān)閉curl;
5、輸出數(shù)據(jù)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
因?yàn)?,PHP CURL庫默認(rèn)1024字節(jié)的長(zhǎng)度不等待數(shù)據(jù)的返回,所以你那段代碼需增加一項(xiàng)配置:
curl_setopt($ch,?CURLOPT_HTTPHEADER,?array('Expect:'));
給你一個(gè)更全面的封裝方法:
function?req_curl($url,?$status?=?null,?$options?=?array())
{
$res?=?'';
$options?=?array_merge(array(
'follow_local'?=?true,
'timeout'?=?30,
'max_redirects'?=?4,
'binary_transfer'?=?false,
'include_header'?=?false,
'no_body'?=?false,
'cookie_location'?=?dirname(__FILE__)?.?'/cookie',
'useragent'?=?'Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.1',
'post'?=?array()?,
'referer'?=?null,
'ssl_verifypeer'?=?0,
'ssl_verifyhost'?=?0,
'headers'?=?array(
'Expect:'
)?,
'auth_name'?=?'',
'auth_pass'?=?'',
'session'?=?false
)?,?$options);
$options['url']?=?$url;
$s?=?curl_init();
if?(!$s)?return?false;
curl_setopt($s,?CURLOPT_URL,?$options['url']);
curl_setopt($s,?CURLOPT_HTTPHEADER,?$options['headers']);
curl_setopt($s,?CURLOPT_SSL_VERIFYPEER,?$options['ssl_verifypeer']);
curl_setopt($s,?CURLOPT_SSL_VERIFYHOST,?$options['ssl_verifyhost']);
curl_setopt($s,?CURLOPT_TIMEOUT,?$options['timeout']);
curl_setopt($s,?CURLOPT_MAXREDIRS,?$options['max_redirects']);
curl_setopt($s,?CURLOPT_RETURNTRANSFER,?true);
curl_setopt($s,?CURLOPT_FOLLOWLOCATION,?$options['follow_local']);
curl_setopt($s,?CURLOPT_COOKIEJAR,?$options['cookie_location']);
curl_setopt($s,?CURLOPT_COOKIEFILE,?$options['cookie_location']);
if?(!empty($options['auth_name'])??is_string($options['auth_name']))
{
curl_setopt($s,?CURLOPT_USERPWD,?$options['auth_name']?.?':'?.?$options['auth_pass']);
}
if?(!empty($options['post']))
{
curl_setopt($s,?CURLOPT_POST,?true);
curl_setopt($s,?CURLOPT_POSTFIELDS,?$options['post']);
//curl_setopt($s,?CURLOPT_POSTFIELDS,?array('username'?=?'aeon',?'password'?=?'111111'));
}
if?($options['include_header'])
{
curl_setopt($s,?CURLOPT_HEADER,?true);
}
if?($options['no_body'])
{
curl_setopt($s,?CURLOPT_NOBODY,?true);
}
if?($options['session'])
{
curl_setopt($s,?CURLOPT_COOKIESESSION,?true);
curl_setopt($s,?CURLOPT_COOKIE,?$options['session']);
}
curl_setopt($s,?CURLOPT_USERAGENT,?$options['useragent']);
curl_setopt($s,?CURLOPT_REFERER,?$options['referer']);
$res?=?curl_exec($s);
$status?=?curl_getinfo($s,?CURLINFO_HTTP_CODE);
curl_close($s);
return?$res;
}