首頁  >  文章  >  後端開發  >  爬蟲實戰:用 PHP 爬取京東商品訊息

爬蟲實戰:用 PHP 爬取京東商品訊息

PHPz
PHPz原創
2023-06-13 11:11:192057瀏覽

在當今的電商時代,京東身為中國最大的綜合電商之一,每日上架的商品數量甚至可以達到數萬種。對於廣大的消費者來說,京東提供了廣泛的商品選擇和優勢的價格優惠。但是,有些時候,我們需要批量獲取京東商品信息,快速篩選、比較、分析等等。這時候,我們就需要用到爬蟲技術了。在本篇文章中,我們將會介紹利用PHP語言編寫爬蟲,幫助我們快速爬取京東商品資訊的實作。

  1. 準備工作

首先,我們需要安裝php所需的curl擴展,並設定一些常用的變數。具體步驟如下:

首先,打開終端機或powershell,輸入以下命令來安裝curl擴充包:

sudo apt-get install php7.0-curl //ubuntu系统安装
brew install curl-openssl php-curl //macOS系统安装

接著,我們需要在PHP的程式碼中設定一些簡單的變量,方便我們在後續的代碼中使用。例如,我們定義一個$jgname變數表示京東的訪問位址,另一個$skulist變數表示每個商品的存取位址。程式碼如下:

$jgname= "https://list.jd.com/list.html?cat=1318,1486,1490&ev=exbrand_13910&sort=sort_rank_asc&trans=1&JL=3_%E5%93%81%E7%89%8C_%E5%B0%8F%E7%B1%B3%EF%BC%88MI%EF%BC%89#J_crumbsBar";
$skulist="https://item.jd.com/1285310.html";
  1. 取得商品清單

現在我們已經準備完了環境和需要的變量,我們可以開始寫我們的爬蟲了。首先,我們需要取得目標京東商品頁面的商品清單。我們可以根據,京東商品頁的存取地址(即$jgname),利用curl的工具和正規表示式來取得目標連結。分別取得價格、評論數、商品名稱、商品編號等等商品資訊。

具體程式碼如下:

$ch = curl_init();//初始化curl

curl_setopt($ch, CURLOPT_URL,$jgname);//设置url属性
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//设置是否将curl_exec()获取的信息以字符串返回,而不是直接输出
$result = curl_exec ($ch);//执行一个curl会话
curl_close ($ch);//关闭curl会话

preg_match_all("/<li .*?</li>/", $result, $matches);//正则表达式把需要的内容取出来,即匹配<li>标签

$goodsinfo=array();//创建一个商品列表

foreach ($matches[0] as $item) {
    //获取商品信息
    preg_match("/sku="(d+)"/",$item,$skuid);
    preg_match("/标题">s{0,}([dD]+?)s{0,}</a>/",$item,$titlename);
    preg_match("/<strong>¥</strong>[s
]{0,}<i>(d+.d+)</i>/",$item,$price);
    preg_match("/<divs{0,}class="p-commit">[s
]+<strong[^>]+>(d+)/",$item,$commentnum);
    preg_match("/<as{0,}href="([dD]+?)"/",$item,$link);

    //将商品信息存储到商品列表中
    $goods=array(
         "title"=>trim($titlename[1]),
         "price"=>trim($price[1]),
         "link"=>"https:".$link[1],
         "skuid"=>trim($skuid[1]),
         "commentnum"=>trim($commentnum[1])
    );
    array_push($goodsinfo,$goods);//将商品信息添加到商品列表

    //输出测试:打印商品信息
    echo $goods['title']." ".$goods['price']." ".$goods['commentnum']." ".$goods['link']."<br>";
}

在上述程式碼中,我們將取得到的每個商品的連結和編號儲存在了$goods'skuid'和'link'中,並將其它有用的信息(價格,評論數等)放入$goods數組。最後,經由array_push()函數加入到$goodsinfo數組中。你可以使用循環語句來輸出商品列表訊息,以便於查看爬取結果。

  1. 獲取商品詳細信息

現在,我們已經獲取到了京東商品表頁中的商品列表信息,接下來的步驟就是獲取每個商品的詳細信息,並將其儲存在$goods數組中。我們在上一步的$goods數組中已經取得了每個商品的編號和連結。因此,接下來的操作就是打開每個鏈接,以獲取各種有用的商品資訊。具體代碼如下:

foreach ($goodsinfo as &$goods) {
    //更新每个商品的网页链接
    $link="https://item.jd.com/".$goods['skuid'].".html";
    $goods['link']=$link;

    $canBuy=true;//官网上可以买
    //判断是否能够购买
    preg_match('/无货/',file_get_contents($link)) && ($canBuy=false);

    //利用curl工具打开网页链接,获得网页代码
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$link);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $html = curl_exec ($ch);
    curl_close ($ch);
    //分析网页代码,使用正则表达式获取商品种类,价格,颜色,库存数量等数据,并保存
    preg_match_all('/<divs{0,}class="Ptable".*?>[s
]+<divs{0,}class="Ptable-item".*?>[s
]+([dD]*?)</div>/',$html,$items);
    preg_match_all('/<strong>商品名称</strong><em>(d.*)</em>/',$html,$item);
    $goods['title']=$item[1][0];
    echo $goods['title'];

    if($canBuy)
    {
        foreach ($items[1] as &$item) {
            //去掉html标记、空格、换行符
            $item=strip_tags($item);
            $item=str_replace(" ","",$item); 
            $item=str_replace("    ","",$item); 
            $item=str_replace("
","",$item);
            $item=str_replace("
","",$item); 

            //切割字符串,获取键值对
            preg_match_all('/([dD]*?):([dD]*?)[
]/',$item,$item2);
            if(count($item2[1])>0){
                for($i=0;$i<count($item2[1]);$i++){
                    if($item2[1][$i]=="价格"){
                        $goods['price']=$item2[2][$i];
                    }elseif($item2[1][$i]=="颜色"){
                        $goods['color']=$item2[2][$i];
                    }elseif($item2[1][$i]=="产地"){
                        $goods['producePlace']=$item2[2][$i];
                    }elseif($item2[1][$i]=="商品编号"){
                        $goods['goodsn']=$item2[2][$i];
                    }elseif($item2[1][$i]=="型号"){
                        $goods['model']=$item2[2][$i];
                    }elseif($item2[1][$i]=="商品毛重"){
                        $goods['grossWeight']=$item2[2][$i];
                    }elseif($item2[1][$i]=="规格"){
                        $goods['specifications']=$item2[2][$i];
                    }
                }
            }
        }
        //获取商品评论数
        preg_match_all('/<as{0,}href="#comment"s{0,}target="_self">s{0,}[dD]+?<strongs{0,}class="curr-num">(d*)</',$html,$comment);
        $goods['commentnum']=$comment[1][0];
    }
}

在這些代碼中,我們使用了類似於第2步的技術,利用curl工具獲得每個商品的詳細鏈接,然後利用正則表達式來獲取一些有用的商品信息。我們可以透過以下方式來輸出所獲得的商品詳細資訊:

foreach ($goodsinfo as &$goods) {
    echo $goods['skuid']." ".$goods['title']." ".$goods['price']." ".$goods['commentnum']." ".$goods['link']."<br>";
}

整個流程就這些了。在實際應用中,我們可以根據實際的需求對程式碼進行一些調整和最佳化,例如添加異常處理、設定請求頭、調整爬取速度等。總之,在此基礎上,可以建構一個穩定、高效的爬蟲,獲得京東商品訊息,進一步助力電商運作和分析。

以上是爬蟲實戰:用 PHP 爬取京東商品訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn