抓取淘寶數據實例

簡單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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容