美文网首页功能模块http
抓取淘宝数据实例

抓取淘宝数据实例

作者: 王宝花 | 来源:发表于2017-03-02 16:23 被阅读573次

    简单demo

    1. curl.php是封装的一个curl请求的一个函数
    2. model.php是数据库的读写操作
    3. list.php和details.php是具体抓取页面数据并写入数据库的操作。

    流程及难点

    1. 跳过Https的验证。
    2. 用浏览器工具如Chrome的检查和Firefox的Firebug检查网络加载资源并分析。
    3. 数据解码,分析。
    4. 正则匹配数据。

    Demo的简介

    本次试验是扒取淘宝二手手机广场的网页及数据详情页,手机广场页查看网络资源之后,看到是返回的一个json数据,直接可以使用。详情页返回的也是json数据,但是数据都集中在一条字串中显现,所以我用的是正则。

    不足之处很多,欢迎指正。

    源码

    curl.php

    <?php
    // 获取网页信息
    function getInfo($url)
    {
        $curl = curl_init();// 初始化
        curl_setopt_array($curl, array(// 设置参数
          CURLOPT_URL => $url,
          CURLOPT_RETURNTRANSFER => true,// 返回流数据
          CURLOPT_SSL_VERIFYPEER => 0,// 跳过SSL验证
          CURLOPT_REFERER => "https://www.taobao.com/",// 伪造原网站
          CURLOPT_HEADER => false,// 不输出头
          CURLOPT_FOLLOWLOCATION => false,// 支持跳转
        ));
        $response = curl_exec($curl);// 返回值(字串)
        curl_close($curl);// 资源关闭
        return $response;// 返回数据
    }
    ?>
    

    model.php

    <?php
    // 数据库连接
    function insertDB($sql){
        $link = mysql_connect("localhost","root","") or die("连接数据库失败");// 连接数据库
        mysql_select_db("taobao");// 选择数据库
        mysql_set_charset("utf8");// 设定字符集  
        $result = mysql_query($sql);// 发送sql条语句
        if($result && mysql_affected_rows()>0){// 判断有效性
            $msg = "添加成功";
        }else{
            $msg = "添加失败";
        }
        mysql_close($link);// 关闭数据库
        return $msg;
    }
    
    // 数据库查询
    function selectDB($sql){
        $link = mysql_connect("localhost","root","") or die("连接数据库失败");// 连接数据库
        mysql_select_db("taobao");// 选择数据库
        mysql_set_charset("utf8");// 设定字符集  
        $result = mysql_query($sql);// 发送sql条语句
        if($result){// 判断有效性
            $arr = array();
            while($row = mysql_fetch_assoc($result)){
                $arr[] = $row;
            }
            return $arr;
        }else{
            mysql_close($link);// 关闭数据库
            return "查询失败";
        }
        mysql_close($link);// 关闭数据库
    }
    

    details.php

    <?php
    include("./curl.php");
    include("./model.php");
    
    // 数据库查询iTemUrl存入数组
    $sql = "select itemUrl from list";
    
    $arr = selectDB($sql);
    $num = count($arr);
    
    // for($i=0;$i<350;$i++){
    //  $itemId = str_replace("https://item.taobao.com/item.htm?id=", "", $arr[$i]);
    //  echo $itemId."<br>";
    // }
    // exit;
    $i = null;
    for($i=0;$i<350;$i++){
    // for($i=;$i<5;$i++){
        $itemId = str_replace("https://item.taobao.com/item.htm?id=", "", $arr[$i]['itemUrl']);
        echo $itemId."<br>";
        $url = "https://paimai.taobao.com/module/get_auction_basic.htm?itemId=".$itemId."&richdom=true&gvar=TAOBAO_PAIMAI_BIDSAU&from=detail&t=1463368896996";
    
        $response = getInfo($url);
        
        $str = iconv("gbk","utf-8",$response);// json转码
        
        $pricePattern = '/<strong class=\\\"J_CurrentPrice\\\">.*?<\/strong>/';
        preg_match($pricePattern,$str,$arr1);
        $price = strip_tags($arr1[0]);// 当前价格
    
        $initPricePattern = '/<em class=\\\"tbid-price J_InitPrice\\\">.*?<\/em>/';
        preg_match($initPricePattern,$str,$arr2);
        $initPrice = strip_tags($arr2[0]);// 起拍价格
    
        $addPricePattern = '/<em class=\\\"tbid-price J_AddPrice\\\">.*?<\/em>/';
        preg_match($addPricePattern,$str,$arr3);
        $addPrice = strip_tags($arr3[0]);// 加价幅度
    
        $typePattern = '/<em class=\\\"J_BidType\\\">.*?<\/em>/';
        preg_match($typePattern,$str,$arr4);
        $type = strip_tags($arr4[0]);// 拍卖类型
    
        $numPattern = '/<em class=\\\"tbid-count J_BaibeiNum\\\">.*?<\/em>/';
        preg_match($numPattern,$str,$arr5);
        $num = strip_tags($arr5[0]);// 宝贝个数
    
        $peoplePattern = '/<em class=\\\"tbid-people J_AuctionPeople\\\">.*?<\/em>/';
        preg_match($peoplePattern,$str,$arr6);
        $people = strip_tags($arr6[0]);// 出价人数
    
        $timePattern = '/<em id=\\\"J_BidCount\\\" class=\\\"J_BidCount\\\">.*?<\/em>/';
        preg_match($timePattern,$str,$arr7);
        $time = strip_tags($arr7[0]);// 出价次数
    
        $delayPattern = '/<a target=\\\"blank\\\" href=\\\"\/\/service.taobao.com\/support\/knowledge-1201111.htm\\\" class=\\\"J_delay\\\">.*?<i><\/i><\/a>/';
        preg_match($delayPattern,$str,$arr8);
        $delay = strip_tags($arr8[0]);// 出价频率
    
        // $url = "https://desc.alicdn.com/i6/530/551/".$itemId."/TB1BNRXJFXXXXXHapXX8qtpFXlX.desc%7Cvar%5Edesc%3Bsign%5E140626cc481b4e0f320bc71dcd999b46%3Blang%5Egbk%3Bt%5E1463369040";
    
        // $des = getInfo($url);
    
        // $str = iconv("gbk","utf-8",$des);// json转码
    
        // 插入数据库
        $sql = "insert into details(itemId,initPrice,addPrice,type,num,people,time,delay,des) value('".$itemId."','".$initPrice."','".$addPrice."','".$type."','".$num."','".$people."','".$time."','".$delay."','描述')";
        // echo $sql;
        $msg = insertDB($sql);
        
        // echo $sql;
        echo "<h5>第".$i."条".$msg."</h5>";
    }
    

    list.php

    <?php
    include("./curl.php");
    include("./model.php");
    
    $urls = [];// 将需要获取的网址存入数组
    for($i=0;$i<=12;$i++){
        $urls[] = "https://api-cu.taobao.com/cuItemDisplay.do?_ksTS=1463216435208_80&callback=jsonp81&sort=end_time+asc&floor_code=51f9aeae57&page_no=".$i;
    }
    
    for($j=0;$j<count($urls);$j++){// 请求网页数据
        $response = getInfo($urls[$j]);
        $str = iconv("gbk","utf-8",$response);// 数据转码
        $code = substr($str, 12,strlen($str)-14);// 修改成对象格式
        $obj = json_decode($code);// 转成对象
        
        for($o=0;$o<50;$o++){// 存入数组,每页有50条数据
            if(empty($obj->resultDO->cuItemVsDOs[$o]->sellerId)){
                continue;
            }
            $sellerId = $obj->resultDO->cuItemVsDOs[$o]->sellerId;// 商品ID
            $itemUrl = "https:".$obj->resultDO->cuItemVsDOs[$o]->itemUrl;// 详情页地址
            $title = $obj->resultDO->cuItemVsDOs[$o]->title;// 名称
            $picUrl = "http://img.alicdn.com/bao/uploaded/".$obj->resultDO->cuItemVsDOs[$o]->picUrl;// 拼接图片地址
            $price = $obj->resultDO->cuItemVsDOs[$o]->curPrice->amount;// 价格
    
            $sql = "insert into list(sellerId,title,price,itemUrl,picUrl) value('".$sellerId."','".$title."','".$price."','".$itemUrl."','".$picUrl."')";
            // echo $sql;
            $msg = insertDB($sql);
    
            echo "<h5>第".($j+1)*$o."条数据".$msg."</h5>";
        }
    }
    

    数据库的结构

    QQ图片20160517100911.png

    注:des字段没用到,因为还要请求一次curl,会导致浏览器卡死,在代码中默认插入的信息为描述

    QQ图片20160517100934.png

    相关文章

      网友评论

        本文标题:抓取淘宝数据实例

        本文链接:https://www.haomeiwen.com/subject/ofcirttx.html