抓取淘宝数据实例

简单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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,732评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,214评论 3 426
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,781评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,588评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,315评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,699评论 1 327
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,698评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,882评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,441评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,189评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,388评论 1 372
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,933评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,613评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,023评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,310评论 1 293
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,112评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,334评论 2 377

推荐阅读更多精彩内容