php-扒数据

一、准备

1.弄清自己需要的数据

2.分析数据的规律

3.分析保存数据的方式(文本文件或数据库)

二、模拟http请求,获得源码

这里模拟http请求我用的是curl模拟的,具体实现代码:

/**
 * Curl请求
 *
 * @param string $requesturl //请求URL
 * @param string $reuqestmothed //请求方法 默认false(为GET) true(为POST)
 * @param int $httpcode http状态码 以引用的形式传递
 * @param int $postdata post的数据
 * @return string or false
 */
function curlRequest($requesturl,$reuqestmethod=false,& $httpcode=0,$postdata=NULL) {
    try {
        $options = array(
            CURLOPT_URL => $requesturl,
            CURLOPT_RETURNTRANSFER  => true,//启用回去返回数据
            CURLOPT_FOLLOWLOCATION => true,         // follow redirects 
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_POST => $reuqestmethod
        );
        if(true===$reuqestmethod){
            $options[CURLOPT_POSTFIELDS] = $postdata;
        }
        $ch = curl_init();//初始化
        curl_setopt_array($ch,$options);//参数设置
        $rs = curl_exec($ch);//执行s
        $httpcode =curl_getinfo($ch,CURLINFO_HTTP_CODE); //http状态码
        curl_close($ch);
        unset($ch);
        return $rs;
    }catch (Exception $ex){
        throw $ex;
    }
}
$url = 'http://www.html5tricks.com/page/1'; //要扒取数据的网页
$res = curlRequest($url);
var_dump($res);//返回的就是html源码

三、分析源码规律

分析html源码的规律,一般数据都是有规律的显示在页面上,可以正则匹配获取需要的数据,也可根据规律字符串拆分,这里我放一个我的做的实例:

    /**
     * 扒数据
     */
    public function readTxt()
    {
        for ($i = 0; $i < 108; $i ++) {
            $url = 'http://www.html5tricks.com/page/' . $i;
            $res = curlRequest($url);
            $html = preg_replace("/[\t\n\r]+/", "", $res);
            $array1 = explode("<article", $html);
            foreach ($array1 as $key => $val) {
                if ($key > 0) {
                    $array2 = explode("</h1>", $val);
                    $i1 = preg_match('/(\"+(.*?)*\"+)/i', $array2[0], $matches);
                    // id
                    $id = str_replace('"', '', $matches[0]);

                    // 标题
                    $title = strip_tags($array2[0]);
                    $title = explode(">", $title);
                    $title = $title[1];

                    // 内容
                    $c = explode('<div class="entry-content">', $array2[1]);
                    preg_match_all('/<p>(.*?)<\/p>/', $c[1], $arr3);
                    $content = strip_tags($arr3[0][0]);

                    // 图片---下载保存图片,图片以id命名
                    preg_match_all('/(src\=\"+(.*?)*\"+)/i', $arr3[0][1], $img);

                    // 特例:直接返回
                    if (empty($img[0])) {
                        continue;
                    }

                    $imgurl = $img[0][0];
                    $imgurl = explode('"', $imgurl);
                    $imgurl = $imgurl[1];
                    // $res = $this->http_get_data($imgurl);
                    $dir = "E:\\dataimg2\\";
                    $filename = $dir . $id . ".png";
                    $imgfilename = '\\' . $id . ".png";
                    // $fp = @fopen($filename, "a"); // 将文件绑定到流 
                    // fwrite($fp, $res); // 写入文件
                    // fclose($fp);

                    // 演示地址
                    $d = explode('</div>', $c[1]);
                    $d = explode('<p class="tricksButtons">', $d[0]);
                    //特例:直接返回
                    if (! isset($d[1])) {
                        continue;
                    }
                    preg_match_all('/(href\=\"+(.*?)*\"+)/i', $d[1], $demo);

                    if (empty($demo[0])) {
                        continue;
                    }
                    $demoUrl = $demo[0][0];
                    $demoUrl = explode('"', $demoUrl);
                    $demoUrl = $demoUrl[1];

                    // 源码下载
                    $downloadUrl = $demo[0][1];
                    $downloadUrl = explode('"', $downloadUrl);
                    $downloadUrl = $downloadUrl[1];
                    // exit();
                    $this->insert($id, $title, $content, $imgfilename, 
                    $demoUrl, $downloadUrl, time());//将结果保存数据库
                }
            }
            // exit();
            // sleep(1);  防止ip限制,休息一秒
        }

        exit();
    }

四、保存结果到数据库

 $mysql_server_name = 'localhost'; // 改成自己的mysql数据库服务器
 $mysql_username = 'root'; // 改成自己的mysql数据库用户名
 $mysql_password = ''; // 改成自己的mysql数据库密码
 $mysql_database = 'test'; // 改成自己的mysql数据库名
 $conn = mysql_connect($mysql_server_name, $mysql_username,
 $mysql_password) or die("error connecting"); // 连接数据库
 mysql_query("set names 'utf8'"); // 数据库输出编码
 mysql_select_db($mysql_database); // 打开数据库
 set_time_limit(0);

    /**
     * 插入数据库
     *
     * @param unknown $keyword            
     */
    public function insert($Did, $Title, $Content, $Img, $DemoUrl, $DownloadUrl, $AddTime)
    {
        try {
            $sql = "insert into data(Did,Title,Content,Img,DemoUrl,DownloadUrl,AddTime)values('" . $Did . "','" . $Title . "','" . $Content . "','" . $Img . "','" . $DemoUrl . "','" . $DownloadUrl . "'," . $AddTime . ")"; // SQL语句

            show_bug(mysql_query($sql));
            show_bug(mysql_error());
            echo '<hr/>';
        } catch (Exception $e) {
            echo $e;
        }
    }

获得最终数据后,还要根据自己的需求进一步对数据进行改正处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值