創(chuàng)建一個(gè)新cURL資源
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),商丘網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:商丘等地區(qū)。商丘做網(wǎng)站價(jià)格咨詢:13518219792
設(shè)置URL和相應(yīng)的選項(xiàng)
抓取URL并把它傳遞給瀏覽器
關(guān)閉cURL資源,并且釋放系統(tǒng)資源
代碼案例:
?php
/*
* 如下: 方法有點(diǎn)笨
* 抓取網(wǎng)頁(yè)內(nèi)容用 PHP 的正則
* 用JS每隔5分鐘刷新當(dāng)前頁(yè)面---即重新獲取網(wǎng)頁(yè)內(nèi)容
*
* 注: $mode中--title/title-更改為所需內(nèi)容(如 $mode = "#a(.*)/a#";獲取所有鏈接)
*
* window.location.href="";中的
* 更改為自己的URL----作用:即刷新當(dāng)前頁(yè)面
*
* setInterval("ref()",300000);是每隔300000毫秒(即 5 * 60 *1000 毫秒即5分鐘)執(zhí)行一次函數(shù) ref()
*
* print_r($arr);輸出獲得的所有內(nèi)容 $arr是一個(gè)數(shù)組 可根據(jù)所需輸出一部分(如 echo $arr[1][0];)
* 若要獲得所有內(nèi)容 可去掉
* $mode = "#title(.*)/title#";
if(preg_match_all($mode,$content,$arr)){
print_r($arr);
echo "br/";
echo $arr[1][0];
}
再加上 echo $content;
*/
$url = ""; //目標(biāo)站
$fp = @fopen($url, "r") or die("超時(shí)");
$content=file_get_contents($url);
$mode = "#title(.*)/title#";
if(preg_match_all($mode,$content,$arr)){
//print_r($arr);
echo "br/";
echo $arr[1][0];
}
?
script language="JavaScript" type="text/javascript"
--
function ref(){
window.location.href="";
}
setInterval("ref()",300000);
//--
/script
pcntl_fork或者swoole_process實(shí)現(xiàn)多進(jìn)程并發(fā)。按照每個(gè)網(wǎng)頁(yè)抓取耗時(shí)500ms,開200個(gè)進(jìn)程,可以實(shí)現(xiàn)每秒400個(gè)頁(yè)面的抓取。
curl實(shí)現(xiàn)頁(yè)面抓取,設(shè)置cookie可以實(shí)現(xiàn)模擬登錄
simple_html_dom 實(shí)現(xiàn)頁(yè)面的解析和DOM處理
如果想要模擬瀏覽器,可以使用casperJS。用swoole擴(kuò)展封裝一個(gè)服務(wù)接口給PHP層調(diào)用
在這里有一套爬蟲系統(tǒng)就是基于上述技術(shù)方案實(shí)現(xiàn)的,每天會(huì)抓取幾千萬(wàn)個(gè)頁(yè)面。
可以參考以下幾種方法:
方法一: file_get_contents獲取
span style="white-space:pre"?/span$url="";
span style="white-space:pre"?/span$fh= file_get_contents
('');span style="white-space:pre"?/spanecho $fh;
方法二:使用fopen獲取網(wǎng)頁(yè)源代碼
span style="white-space:pre"?/span$url="";
span style="white-space:pre"?/span$handle = fopen ($url, "rb");
span style="white-space:pre"?/span$contents = "";
span style="white-space:pre"?/spanwhile (!feof($handle)) {
span style="white-space:pre"??/span$contents .= fread($handle, 8192);
span style="white-space:pre"?/span}
span style="white-space:pre"?/spanfclose($handle);
span style="white-space:pre"?/spanecho $contents; //輸出獲取到得內(nèi)容。
方法三:使用CURL獲取網(wǎng)頁(yè)源代碼
$url="";
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$curl = curl_init();?//創(chuàng)建一個(gè)新的CURL資源
curl_setopt($curl, CURLOPT_URL, $url);?//設(shè)置URL和相應(yīng)的選項(xiàng)
curl_setopt($curl, CURLOPT_HEADER, 0);? //0表示不輸出Header,1表示輸出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);?//設(shè)定是否顯示頭信息,1顯示,0不顯示。//如果成功只將結(jié)果返回,不自動(dòng)輸出任何內(nèi)容。如果失敗返回FALSE
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_ENCODING, '');?//設(shè)置編碼格式,為空表示支持所有格式的編碼
//header中“Accept-Encoding: ”部分的內(nèi)容,支持的編碼格式為:"identity","deflate","gzip"。
curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
//設(shè)置這個(gè)選項(xiàng)為一個(gè)非零值(象 “Location: “)的頭,服務(wù)器會(huì)把它當(dāng)做HTTP頭的一部分發(fā)送(注意這是遞歸的,PHP將發(fā)送形如 “Location: “的頭)。
$data = curl_exec($curl);
echo $data;
//echo curl_errno($curl); //返回0時(shí)表示程序執(zhí)行成功
curl_close($curl);?//關(guān)閉cURL資源,并釋放系統(tǒng)資源
拓展資料
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本預(yù)處理器”)是一種通用開源腳本語(yǔ)言。語(yǔ)法吸收了C語(yǔ)言、Java和Perl的特點(diǎn),利于學(xué)習(xí),使用廣泛,主要適用于Web開發(fā)領(lǐng)域。PHP 獨(dú)特的語(yǔ)法混合了C、Java、Perl以及PHP自創(chuàng)的語(yǔ)法。它可以比CGI或者Perl更快速地執(zhí)行動(dòng)態(tài)網(wǎng)頁(yè)。
用PHP做出的動(dòng)態(tài)頁(yè)面與其他的編程語(yǔ)言相比,PHP是將程序嵌入到HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)文檔中去執(zhí)行,執(zhí)行效率比完全生成HTML標(biāo)記的CGI要高許多;PHP還可以執(zhí)行編譯后代碼,編譯可以達(dá)到加密和優(yōu)化代碼運(yùn)行,使代碼運(yùn)行更快。
參考資料:PHP(超文本預(yù)處理器)-百度百科
其實(shí)用PHP來(lái)爬會(huì)非常方便,主要是PHP的正則表達(dá)式功能在搜集頁(yè)面連接方面很方便,另外PHP的fopen、file_get_contents以及l(fā)ibcur的函數(shù)非常方便的下載網(wǎng)頁(yè)內(nèi)容。
具體處理方式就是建立就一個(gè)任務(wù)隊(duì)列,往隊(duì)列里面插入一些種子任務(wù)和可以開始爬行,爬行的過(guò)程就是循環(huán)的從隊(duì)列里面提取一個(gè)URL,打開后獲取連接插入隊(duì)列中,進(jìn)行相關(guān)的保存。隊(duì)列可以使用數(shù)組實(shí)現(xiàn)。
當(dāng)然PHP作為但線程的東西,慢慢爬還是可以,怕的就是有的URL打不開,會(huì)死在那里。
給一個(gè)例子你看看吧.
if($pro_list_contents=@file_get_contents(''))
{
preg_match_all("/td width=\"50%\" valign=\"top\"(.*)td width=\"10\"img src=\"images\/spacer.gif\"/isU", $pro_list_contents, $pro_list_contents_ary);
for($i=0; $icount($pro_list_contents_ary[1]); $i++)
{
preg_match_all("/a href=\"(.*)\"img src=\"(.*)\".*span(.*)\/span/isU", $pro_list_contents_ary[1][$i], $url_img_price);
$url=addslashes($url_img_price[1][0]);
$img=str_replace(' ', '20%', trim(''.$url_img_price[2][0]));
$price=(float)str_replace('$', '', $url_img_price[3][0]);
preg_match_all("/a class=\"ml1\" href=\".*\"(.*)\/a/isU", $pro_list_contents_ary[1][$i], $proname_ary);
$proname=addslashes($proname_ary[1][0]);
include("inc/db_connections.php");
$rs=mysql_query("select * from pro where Url='$url' and CateId='{$cate_row['CateId']}'"); //是否已經(jīng)采集了
if(mysql_num_rows($rs))
{
echo "跳過(guò):{$url}br";
continue;
}
$basedir='/u_file/pro/img/'.date('H/');
$save_dir=Build_dir($basedir); //創(chuàng)建目錄函數(shù)
$ext_name = GetFileExtName( $img ); //取得圖片后輟名
$SaveName = date( 'mdHis' ) . rand( 10000, 99999 ) . '.' . $ext_name;
if( $get_file=@file_get_contents( $img ) )
{
$fp = @fopen( $save_dir . $SaveName, 'w' );
@fwrite( $fp, $get_file );
@fclose( $fp );
@chmod( $save_dir . $SaveName, 0777 );
@copy( $save_dir . $SaveName, $save_dir . 'small_'.$SaveName );
$imgpath=$basedir.'small_'.$SaveName;
}
else
{
$imgpath='';
}
if($pro_intro_contents=@file_get_contents($url))
{
preg_match_all("/\/h1(.*)\/td\/tr/isU", $pro_intro_contents, $pro_intro_contents_ary);
$p_contents=addslashes(str_replace('src="', 'src="', $pro_intro_contents_ary[1][0]));
$p_contents=SaveRemoteImg($p_contents, '/u_file/pro/intro/'.date('H/')); //把遠(yuǎn)程html代碼里的圖片保存到本地
}
$t=time();
mysql_query("insert into pro(CateId, ProName, PicPath_0, S_PicPath_0, Price_0, Contents, AddTime, Url) values('{$cate_row['CateId']}', '$proname', '$imgpath', '$img', '$price', '$p_contents', '$t', '$url')");
echo $url.$img.$cate."br\r\n";
}
}