抓取淘宝数据实例

简单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

 $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

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

";
// }
// 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."
"; $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>/'; preg_match($pricePattern,$str,$arr1); $price = strip_tags($arr1[0]);// 当前价格 $initPricePattern = '/.*?<\/em>/'; preg_match($initPricePattern,$str,$arr2); $initPrice = strip_tags($arr2[0]);// 起拍价格 $addPricePattern = '/.*?<\/em>/'; preg_match($addPricePattern,$str,$arr3); $addPrice = strip_tags($arr3[0]);// 加价幅度 $typePattern = '/.*?<\/em>/'; preg_match($typePattern,$str,$arr4); $type = strip_tags($arr4[0]);// 拍卖类型 $numPattern = '/.*?<\/em>/'; preg_match($numPattern,$str,$arr5); $num = strip_tags($arr5[0]);// 宝贝个数 $peoplePattern = '/.*?<\/em>/'; preg_match($peoplePattern,$str,$arr6); $people = strip_tags($arr6[0]);// 出价人数 $timePattern = '/.*?<\/em>/'; preg_match($timePattern,$str,$arr7); $time = strip_tags($arr7[0]);// 出价次数 $delayPattern = '/.*?<\/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 "
第".$i."条".$msg."
"; }

list.php

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 "
第".($j+1)*$o."条数据".$msg."
"; } }

数据库的结构

QQ图片20160517100911.png

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

抓取淘宝数据实例_第2张图片
QQ图片20160517100934.png

你可能感兴趣的:(抓取淘宝数据实例)