基于curl數(shù)據(jù)采集之單頁面并行采集函數(shù)get_htmls的使用_PHP教程
推薦:php獲取本地圖片文件并生成xml文件輸出具體思路本文將詳細(xì)介紹下php獲取本地圖片文件并生成xml文件輸出,代碼簡(jiǎn)單實(shí)用,感興趣的朋友可以參考下哈,希望對(duì)你學(xué)習(xí)php有所幫助
用第一篇的get_html()實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)采集,由于是一個(gè)一個(gè)執(zhí)行才采集數(shù)據(jù)的傳輸時(shí)間就會(huì)是所有頁面下載的總時(shí)長(zhǎng),一個(gè)頁面假設(shè)1秒,那么10個(gè)頁面就是10秒了。所幸curl還提供了并行處理的功能。
要寫一個(gè)并行采集的函數(shù),先要了解要采集什么樣的頁面,對(duì)采集的頁面用什么請(qǐng)求,才能寫出一個(gè)相對(duì)常用的函數(shù)。
功能需求分析:
返回什么?
當(dāng)然每一個(gè)頁面的html集合成的數(shù)組
傳遞什么參數(shù)?
編寫get_html()時(shí),我們知道了可以用options數(shù)組來傳遞更多的curl參數(shù),那么多頁面同時(shí)采集函數(shù)的編寫這種特性也得保留下來。
什么類型的參數(shù)?
無論是請(qǐng)求網(wǎng)頁HTML,還是調(diào)用互聯(lián)網(wǎng)api接口,get和post傳遞參數(shù)總是請(qǐng)求同一個(gè)頁面或者接口,只是參數(shù)不同罷了。那么參數(shù)的類型是:
get_htmls($url,$options);
$url 是string
$options,是一個(gè)二維數(shù)組,每一個(gè)頁面的參數(shù)為一個(gè)數(shù)組。
這樣的話,貌似解決了問題。但是我找遍了curl的手冊(cè)都沒有看到get的參數(shù)傳遞在什么地方,所以只能$url 是數(shù)組的形式傳遞并且增加一個(gè)method參數(shù)
函數(shù)的原型就定下來了get_htmls($urls,$options = array, $method = ‘get');代碼如下:
function get_htmls($urls, $options = array(), $method = 'get'){
$mh = curl_multi_init();
if($method == 'get'){//get方式傳值 最常用
foreach($urls as $key=>$url){
$ch = curl_init($url);
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_TIMEOUT] = 5;
curl_setopt_array($ch,$options);
$curls[$key] = $ch;
curl_multi_add_handle($mh,$curls[$key]);
}
}elseif($method == 'post'){//post方式傳值
foreach($options as $key=>$option){
$ch = curl_init($urls);
$option[CURLOPT_RETURNTRANSFER] = true;
$option[CURLOPT_TIMEOUT] = 5;
$option[CURLOPT_POST] = true;
curl_setopt_array($ch,$option);
$curls[$key] = $ch;
curl_multi_add_handle($mh,$curls[$key]);
}
}else{
exit("參數(shù)出錯(cuò)!\n");
}
do{
$mrc = curl_multi_exec($mh,$active);
curl_multi_select($mh);//減少CPU壓力 注釋掉CPU壓力變大
}while($active);
foreach($curls as $key=>$ch){
$html = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh,$ch);
curl_close($ch);
$htmls[$key] = $html;
}
curl_multi_close($mh);
return $htmls;
}
常用的get請(qǐng)求是通過改變url參數(shù)來實(shí)現(xiàn)的,又因?yàn)槲覀兊暮瘮?shù)是針對(duì)數(shù)據(jù)采集的。必然是分類采集,所以網(wǎng)址類似于這種:
http://www.baidu.com/s?wd=shili&pn=0&ie=utf-8
http://www.baidu.com/s?wd=shili&pn=10&ie=utf-8
http://www.baidu.com/s?wd=shili&pn=20&ie=utf-8
http://www.baidu.com/s?wd=shili&pn=30&ie=utf-8
http://www.baidu.com/s?wd=shili&pn=50&ie=utf-8
上面五個(gè)頁面是很有規(guī)律的,改變的僅僅是pn的值。
$urls = array();
for($i=1; $i<=5; $i++){
$urls[] = 'http://www.baidu.com/s?wd=shili&pn='.(($i-1)*10).'&ie=utf-8';
}
$option[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0';
$htmls = get_htmls($urls,$option);
foreach($htmls as $html){
echo $html;//這里得到html 就可以進(jìn)行數(shù)據(jù)處理了
}
模擬常用的post請(qǐng)求:
寫一個(gè)post.php文件如下:
if(isset($_POST['username']) && isset($_POST['password'])){
echo '用戶名是: '.$_POST['username'].' 密碼是: '.$_POST['password'];
}else{
echo '請(qǐng)求錯(cuò)誤!';
}
然后調(diào)用如下:
$url = 'http://localhost/yourpath/post.php';//這里是你的路徑
$options = array();
for($i=1; $i<=5; $i++){
$option[CURLOPT_POSTFIELDS] = 'username=user'.$i.'&password=pass'.$i;
$options[] = $option;
}
$htmls = get_htmls($url,$options,'post');
foreach($htmls as $html){
echo $html;//這里得到html 就可以進(jìn)行數(shù)據(jù)處理了
}
這樣這個(gè)get_htmls函數(shù)也基本能實(shí)現(xiàn)一些數(shù)據(jù)采集的功能了
今天分享就到這里 寫的不好的 講得不清楚的 請(qǐng)多多指教
分享:php 模擬get_headers函數(shù)的代碼示例本篇文章介紹了,php模擬get_headers函數(shù)的代碼示例。需要的朋友參考下
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- 網(wǎng)站模板:web上存漏洞及原理分析、防范方法
- PHP在Web開發(fā)領(lǐng)域的優(yōu)勢(shì)在哪?
- 克隆一個(gè)新項(xiàng)目的快捷方式
- 如何使用php判斷服務(wù)器是否是HTTPS連接
- 概述怎樣用新PHP插件實(shí)現(xiàn)MySQL為基礎(chǔ)的事務(wù)
- 解讀使用PHP4.2.0及以后版本的注意事項(xiàng)
- php修改NetBeans默認(rèn)字體的大小
- PHP在網(wǎng)站開發(fā)中的一些優(yōu)勢(shì)
- 作為PHP程序員應(yīng)該了解MongoDB的五件事
- 如何使PHP和JS實(shí)現(xiàn)HTTP上安全地傳輸密碼
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索基于curl數(shù)據(jù)采集之單頁面并行采集函數(shù)get_htmls的使用
- 教程說明:
PHP教程-基于curl數(shù)據(jù)采集之單頁面并行采集函數(shù)get_htmls的使用
。