设为首页 收藏本站
查看: 1124|回复: 0

[经验分享] PHP采集 抓取

[复制链接]

尚未签到

发表于 2015-8-24 11:30:33 | 显示全部楼层 |阅读模式
  今天被安排做一下搜狐首页新闻部分抓取。本来很简单的事情,谁知到了搜狐页面抓过来的一直是乱码,怎么转都不行。只好深入研究了一下,也学到不少东西,写下来分享一下。
  一、 什么是php采集程序?
  二、 为什么要采集?
  三、 采集些什么?
  四、 如何采集?
  五、 采集思路
  六、 采集范例程序
  七、 采集心得
  
  什么是php采集程序?
      php采集程序,也叫php小偷,主要是用于自动搜集网络上web页里特定内容,用php语言写的web程序,运行于支持php的平台上。谈到“自动搜集”,你可能联想到百度goole,联想到搜索引擎所做的事情。php采集程序,正是做类似的工作。
  为什么要采集?
      互联网正以飞快的速度在发展,web数据每天以几何级数据量递增,面对这庞大的数据,作为一个网站管理员的你,该如何搜集自己所需要的信息呢?特别对某个 或某几个同类网站,你需要它们的大量信息,来充实你的网站内容,难道就只能复制粘贴的过日子吗?一个网站管理员,你真的就得花大量时间去搞原创内容,而与整个互联网信息量的发展速度脱节吗?这些问题的解决方法只有一个:采集。如果有那么一个程序,你帮你的网站自动或半自动的采集你所需要的特定内容,即时更 新你网站的信息,是否是你梦寐以求的呢?这就是采集程序出现的原因所在。
  采集些什么?
       这要看你做的什么类型的网站了。如果你做图片站,就采集图片;做音乐站,就采集mp3,做新闻站,就采集新闻等等。一切根据你网站的内容架构需要而定。确定你要采集的东西,才好写出相应的采集程序。
  如何采集?
      通常采集程序,都是有的放矢的。也就是需要有目标网站,搜集一些你需要的采集内容的网站,分别对其html代码进行分析,找出规律性的东西,依据你要采集 的特定内容,写出php代码。采集到你要的东西以后,你可以选择自己需要的存放方式。比如直接生成html页面,或是放进数据库,作进一步处理或是存放成 特定的形式,以备后用。
  采集思路   
       采集程序的思路很简单大体可以分为以下几个步骤:
  1. 获取远程文件源代码(file_get_contents或用fopen).
       2.分析代码得到自己想要的内容(这里用正则匹配,一般是得到分页)。
       3.跟根得到的内容进行下载入库等操作。
      在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。



<?php
/****获取远程文件源代码常用三种方法***/
/***方法一、 fopen(),stream_context_create()方法****/
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);
$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);  
  /******方法二、 socket*******/
function get_content_by_socket($url, $host){
    $fp = fsockopen($host, 80) or die("Open ". $url ." failed");
    $header = "GET /".$url ." HTTP/1.1\r\n";
    $header .= "Accept: */*\r\n";
    $header .= "Accept-Language: zh-cn\r\n";
    $header .= "Accept-Encoding: gzip, deflate\r\n";
    $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n";
    $header .= "Host: ". $host ."\r\n";
    $header .= "Connection: Keep-Alive\r\n";
    //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
    $header .= "Connection: Close\r\n\r\n";
    fwrite($fp, $header);
    while (!feof($fp)) {
        $contents .= fgets($fp, 8192);
    }
    fclose($fp);
    return $contents;
}
/******方法三、file_get_contents (),stream_context_create() 方法三********/
$opts = array(
        'http'=>array(
        'method'=>"GET",
        'header'=>"Content-Type: text/html; charset=utf-8"
            )
        );        
$context = stream_context_create($opts);        
$file = file_get_contents('http://www.sohu.com/', false, $context);        
/******方法四、 PHP的cURL http://www.chinaz.com/program/2010/0119/104346.shtml*******/
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.sohu.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_HTTPHEADER,array ("Content-Type: text/xml; charset=utf-8","Expect: 100-continue"));
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
var_dump($output);
// 4. 释放curl句柄
curl_close($ch);
/*注意
1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
2. 使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:/WINDOWS/system32下;Linux下要安装curl扩展。
*/
?>
  

    采集范例程序
    


/*一个图片下载函数*/
function getimg($url,$filename){
    /*判断图片的url是否为空,如果为空停止函数*/
    if($url==""){
        return false;
    }
    /*取得图片的扩展名,存入变量$ext中*/
    $ext=strrchr($url,".");
    /*判断是否是合法的图片文件*/
  if($ext!=".gif" && $ext!=".jpg"){
        return false;
    }
    /*读取图片*/
    $img=file_get_contents($url);
    /*打开指定的文件*/
    $fp=@fopen($filename.$ext,"a");
    /*写入图片到指点的文件*/
    fwrite($fp,$img);
    /*关闭文件*/
    fclose($fp);
    /*返回图片的新文件名*/
    return $filename.$ext;
}  

采集图片php程序  

DSC0000.gif DSC0001.gif View Code

<?php
/**
*  采集图片php程序
*
*  Copyright(c) 2008 by 小超(ccxxcc) All rights reserved
*
*  To contact the author write to {@link mailto:ucitmc@163.com}
*
* @author ccxxcc
* @version $Id: {filename},v 1.0 {time} $
* @package system
*/
set_time_limit(0);
/**
* 写文件
* @param    string  $file   文件路径
* @param    string  $str    写入内容
* @param    char    $mode   写入模式
*/
function wfile($file,$str,$mode='w')
{
    $oldmask = @umask(0);
    $fp = @fopen($file,$mode);
    @flock($fp, 3);
    if(!$fp)
    {
        Return false;
    }
    else
    {
        @fwrite($fp,$str);
        @fclose($fp);
        @umask($oldmask);
        Return true;
    }
}
function savetofile($path_get,$path_save)
{
        @$hdl_read = fopen($path_get,'rb');
        if($hdl_read == false)
        {
                echo("<span style='color:red'>$path_get can not get</span>");
                Return ;
        }
        if($hdl_read)
        {
                @$hdl_write = fopen($path_save,'wb');
                if($hdl_write)
                {
                        while(!feof($hdl_read))
                        {
                                fwrite($hdl_write,fread($hdl_read,8192));
                        }
                        fclose($hdl_write);
                        fclose($hdl_read);
                        return 1;
                }
                else
                        return 0;
        }
        else
                return -1;
}
function getExt($path)
{
        $path = pathinfo($path);
        return strtolower($path['extension']);
}
/**
* 按指定路径生成目录
*
* @param    string     $path    路径
*/
function mkDirs($path)
{
    $adir = explode('/',$path);
    $dirlist = '';
    $rootdir = array_shift($adir);
    if(($rootdir!='.'||$rootdir!='..')&&!file_exists($rootdir))
    {
        @mkdir($rootdir);
    }
    foreach($adir as $key=>$val)
    {
        if($val!='.'&&$val!='..')
        {
            $dirlist .= "/".$val;
            $dirpath = $rootdir.$dirlist;
            if(!file_exists($dirpath))
            {
                @mkdir($dirpath);
                @chmod($dirpath,0777);
            }
        }
    }
}
/**
* 从文本中取得一维数组
*
* @param    string     $file_path    文本路径
*/
function getFileListData($file_path)
{
    $arr = @file($file_path);
    $data = array();
    if(is_array($arr) && !empty($arr))
    {
        foreach($arr as $val)
        {
            $item = trim($val);
            if(!empty($item))
            {
                $data[] = $item;
            }
        }
    }
    Return $data;
}
//采集开始
//传入自己的需要采集的图片url列表文本文件 每个图片url写一行
$url_file = isset($_GET['file'])&&!empty($_GET['file'])?$_GET['file']:null;
$txt_url = "txt/".$url_file;
$urls = array_unique(getFileListData($txt_url));
if(empty($urls))
{
        echo('<div style="color:red">无链接地址</div>');
        die();
}
$save_url = "images/".date("y_m_d",time())."/";
mkDirs($save_url);  //按日期建立文件夹
$i = 1;
if(is_array($urls)&&count($urls))
{
        foreach($urls as $val)
        {
                savetofile($val,$save_url.date("His",time())."_".$i.".".getExt($val));
                echo($i.".".getExt($val)." got\n");
                $i++;
        }
}
echo('<div style="color:green">finish</div>');
?>  
  除了以上方法还可以用Snoopy,也不错。
  

Snoopy是什么? (下载snoopy)
  
Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
  
Snoopy的一些特点:
  
* 方便抓取网页的内容
  
* 方便抓取网页的文本内容 (去除HTML标签)
  
* 方便抓取网页的链接
  
* 支持代理主机
  
* 支持基本的用户名/密码验证
  
* 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)
  
* 支持浏览器转向,并能控制转向深度
  
* 能把网页中的链接扩展成高质量的url(默认)
  
* 方便提交数据并且获取返回值
  
* 支持跟踪HTML框架(v0.92增加)
  
* 支持再转向的时候传递cookies (v0.92增加)
  

    采集心得
  共享一下个人的采集心德:
    1.不采那些作防盗链了的站,其实可以作假来路但是这样的站采集成本太高
    2.采集尽量快的站,最好在本地进行采集
    3.采集时有很多时候可以先把一部分数据存入数据库,等以后进行下一步的处理。
    4.采集的时候一定要作好出错处理,我一般都是如果采集三次没有成功就跳过。以前经常就因为一条内容不能采就卡在那里一直的采。
    5.入库前一定要作好判断,检查内容的合法,过滤不必要的字符串。
    
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103455-1-1.html 上篇帖子: PHP三层结构(上)——简单三层结构 下篇帖子: PHP查询MongoDB慢的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表