您的位置:首页 > 编程语言 > PHP开发

php 实现简单爬虫

2016-01-30 23:32 666 查看
大部分是由他人博客转载而来, 只是根据目前自己的情况进行了部分修改.

<?php
/**
 * 爬虫程序 -- 原型
 *
 * 从给定的url获取html内容
 * 
 * @param string $url 
 * @return string 
 */
function _getUrlContent($url) {
    $handle = fopen($url, "r");
    if ($handle) {
        $content = stream_get_contents($handle, 1024 * 1024);
        return $content;
    } else {
        return false;
    } 
} 
/**
 * 从html内容中筛选链接
 * 
 * @param string $web_content 
 * @return array 
 */
function _filterUrl($web_content) {
    $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
    $result = preg_match_all($reg_tag_a, $web_content, $match_result);
    if ($result) {
        return $match_result[1];
    } 
} 

function _filterimg($web_content){
	$reg_tag_img =  "/<img[^>]*src\=\"(([^>]*)(jpg|gif|png|bmp|jpeg))\"/i";
	$result = preg_match_all($reg_tag_img, $web_content, $match_result);
	if($result){
		return $match_result[1];
	}
}
/**
 * 修正相对路径
 * 
 * @param string $base_url 
 * @param array $url_list 
 * @return array 
 */
function _reviseUrl($base_url, $url_list) {
    $url_info = parse_url($base_url);
    $base_url = $url_info["scheme"] . '://';
    if ($url_info["user"] && $url_info["pass"]) {
        $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";
    } 
    $base_url .= $url_info["host"];
    if ($url_info["port"]) {
        $base_url .= ":" . $url_info["port"];
    } 
    $base_url .= $url_info["path"];
    print_r($base_url);
    if (is_array($url_list)) {
        foreach ($url_list as $url_item) {
            if (preg_match('/^http/', $url_item)) {
                // 已经是完整的url
                $result[] = $url_item;
            } else {
                // 不完整的url
                $real_url = $base_url . '/' . $url_item;
                $result[] = $real_url;
            } 
        } 
        return $result;
    } else {
        return;
    } 
} 
/**
 * 爬虫
 * 
 * @param string $url 
 * @return array 
 */
function crawler($url) {
    $content = _getUrlContent($url);
    if ($content) {
        $url_list = _reviseUrl($url, _filterUrl($content));
        if ($url_list) {
            return $url_list;
        } else {
            return ;
        } 
    } else {
        return ;
    } 
} 

function crawler_img($url){
	$content = _getUrlContent($url);
    if ($content) {
        $img_list = _filterimg($content);;
        if ($img_list) {
            return $img_list;
        } else {
            return ;
        } 
    } else {
        return ;
    } 
}
/**
 * 测试用主程序
 */
function main() {
    $current_url = "https://hao.360.cn/"; //初始url
    $fp_puts = fopen("url.txt", "ab"); //记录url列表
    $fp_gets = fopen("url.txt", "r"); //保存url列表
	$fp_puts_img = fopen("url-img.txt", "ab");
    do {
		$content = _getUrlContent($current_url);
        $img_url = _filterimg($content);
		foreach($img_url as $url){
			fputs($fp_puts_img, $url."\r\n");
			//echo $url;
			//echo "<br >";
			//GrabImage($url,$filename="");
		}
		
        $result_url_arr = crawler($current_url);
        if ($result_url_arr) {
            foreach ($result_url_arr as $url) {
				fputs($fp_puts, $url."\r\n");
            } 
        } 
		
    } while ($current_url = fgets($fp_gets, 1024)); //不断获得url
	//echo "ok";
} 

//以下是抓取网络图片到本地

    // $url 是远程图片的完整URL地址,不能为空。
    // $filename 是可选变量: 如果为空,本地文件名将基于时间和日期
    // 自动生成.
    function GrabImage($url,$filename="") {
    if($url==""):return false;endif;
    $path="download/"; //指定存储文件夹
    //若文件不存在,则创建;
    if(!file_exists($path)){
    mkdir($path);
    }
    if($filename=="") {
    $ext=strrchr($url,".");
    if($ext!=".gif" && $ext!=".jpg" && $ext!=".bmp" && $ext!=".jpeg" && $ext!=".png"):return false;endif;
    $filename=$path.date("dMYHis").$ext;
    }
    ob_start();
    readfile($url);
    $img = ob_get_contents();
    ob_end_clean();
    $size = strlen($img);
    $fp2=@fopen($filename, "a");
    fwrite($fp2,$img);
    fclose($fp2);
    return $filename;
    }

function main_1(){
	$current_url = "https://hao.360.cn/"; //初始url
	$content = _getUrlContent($current_url);
	$img_url = _filterimg($content);
	foreach($img_url as $url){
		//echo $url;
		//echo "<br >";
		GrabImage($url,$filename="");
	}

}
//main_1();
main();
 
?>


main() 是主程序, 该程序主要是通过 输入一个起始地址, 比如 www.hao123.com 然后进行url 的搜索 ,将页面中所有url 保存到 url.txt文件中, 将所有页面的图片地址 保存到url-img.txt 中

保存到本地的方式被注销了, 即 取消 //GrabImage($url,$filename=""); 这个的注销 就是进行保存 不过目前经常只能保存30张左右, 还不知道是网络问题还是文件命名的问题.

明天可以继续尝试.

-------------------------------------------------------------------

昨天准备今天继续尝试, 结果今天做客有事 忙了一天, 所以php 的爬虫目前就完成到这, 我明天准备开始用python写爬虫.因为毕竟主流的爬虫程序还是不太用php的..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: