您的位置:首页 > 运维架构 > 网站架构

抓取网站内容常见方法

2016-07-20 21:40 495 查看
<?php
/*------------------------
根据给出地址,获取网页及页面内的js,css文件按原文件名保存到本地
-------------------------*/
$url  = 'http://www.zzzzz.com/html_13.html';//页面路径
$dir = APP_PATH.'save-xiaohaopin/';//保存数据的文件夹路径,因框架不同而定APP_PATH
//路径不存在则创建
if(!is_dir($dir)){
mkdir($dir);
}

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
$html = curl_exec($ch);
//html保存
$hpath  = @fopen($dir.'html_13.html','wb');
fwrite($hpath,$html);
fclose($hpath);
//正则表达式
$pre = '/"([^"]*\.(js|css)[^"]*)"/i';//js&css
$urlarr = array();
preg_match_all($pre,$html,$urlarr);
$urlarr = $urlarr[1];
//url处理&&根据url获取结果不同而自定义处理
//./templates/js/gongjutiao.js&&&&&./templates/css/gongjutiao.css
$mainurl = 'http://www.zzzzz.com/';
//just save it
foreach($urlarr as $k => $u){
$surl = str_replace('./','',$u);
$dourl = $mainurl.$surl;
$fileName = substr($u,strrpos($u,'/')+1);
$savePath = $dir.$fileName;
$con = file_get_contents($dourl);
$fop = @fopen($savePath,'wb');
fwrite($fop,$con);
fclose($fop);
}
exit('Obtain all');

/*----------------end
---------------------*/

/*------------------------
获取某个网站过多数据或者抓取过快等因素,都会经常导致IP被封的风险,但我们可以自己利用PHP构造IP地址的方式,获取数据。
-------------------------*/

$headers['CLIENT-IP'] = $headers['X-FORWARDED-FOR'] = '127.0.0.1'; //些处只是个例,IP可以自己定义
$headerArr = array();
foreach( $headers as $n => $m ) {
$headerArr[] = $n .':' . $m;
}
//$refer = $_SERVER["HTTP_REFERER"];

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr); //构造IP
$html = curl_exec($ch);
curl_close($ch);

//下面就可以写自己抓取数据的正则表达式
$reg = '/.*/';

//正则匹配后放到相应的数组里面
$arr= array();
preg_match($reg,$html,$arr);

//可以做数据处理,例:
$val = $arr[1];

//数据组装
$data = array(
'val'     =>$val,
);
//var_dump($data);exit;
//数据添加到数据库,下面是ThinkPHP框架用法
M('WeaponAttr')->add($data);
//如果有封IP风险,可以调节抓取的速度或者做一些其它的优化
sleep(5);
echo 'ok';exit;
/*----------------end
---------------------*/

/*------------------------
在获取某网站的数据的过程中,往往网页会通过网页点击传送js参数,利用ajax去获取数据,形成无刷新页面,在翻页的过程当中有些网站在第一次获取回来的信息之后,就在当前页面保存一个cookie,然后分页面就可以根据cookie的值去获取下一页,而且用同一种分页方式表现:例如:show_1.html,第二页就是show_2.html以此类推,。不管你访问的是哪一个分类,或者其它的一些栏目。它们获取回来的列表分页页面都是以这种形式去表现的,如果删除了cookie页面就会变为空。没有数据。
-------------------------*/
function getdata(){
define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );
$url = 'http://';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR);//连接结束后保存cookie信息的文件。
$html = curl_exec($ch);
curl_close($ch);

//$html是第一次传参数的时候获取回来的数据,用get函数来对获取回来的数据处理
$this->get($html);

//class="page">4</li>//获取分页的信息
$parr = array();
$page = '/class="page">(\d+)</';
preg_match_all($page,$html,$parr);

if(!empty($parr[1])){
$cnum = array_pop($parr[1]);
for($i = 2;$i <= $cnum;$i++){
$n = $this->jdoit($i);//根据coodie去获取下一页的内容回来
$this->get($n);//内容处理
}
}

echo 'okk';
}

function jdoit($num){
$url = 'http://www.xxxx.com/fenye-'.$num.'.html';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
function get($html){

//正则表达式
$reg  = '/<dd[^>]*>([\s\S]*?)<\/dd>/';

/*获取回来的内容可以在此处理*/

}

/*----------------end
---------------------*/

/*------------------------
根据地址,把图片保存到本地
-------------------------*/
$pic_url = 'http://www.picture.com/';
$path = 'D:\picdir';//保存路径
if(!is_dir($path)){
mkdir($path,0777);
}
$filename = $path.'name';
ob_start();
readfile($pic_url);
$img = ob_get_contents();
ob_end_clean();
//$size = strlen($img);
$fp2=@fopen($filename, "a");
fwrite($fp2,$img);
fclose($fp2);
/*----------------end
---------------------*/
?>


 

/*===========================*/
//$proxy_host->代理服务器地址,,$proxy_port->端口
//通过代理获取网页内容
function proxy_get_content($proxy_host,$proxy_port,$proxy_user,$proxy_password,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY,"$proxy_host:$proxy_port");
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "$proxy_user:$proxy_password");
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER,0);
$bcon = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
return $bcon;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: