ホームページ >バックエンド開発 >PHPチュートリアル >実践的なクローラー戦闘: PHP を使用して JD.com 製品情報をクロールする

実践的なクローラー戦闘: PHP を使用して JD.com 製品情報をクロールする

PHPz
PHPzオリジナル
2023-06-13 11:11:192130ブラウズ

今日の電子商取引時代において、JD.com は中国最大の総合電子商取引企業の 1 つとして、毎日数万点の商品を店頭に並べることさえできます。大多数の消費者に対して、JD.com は幅広い製品セレクションと有利な価格特典を提供しています。ただし、場合によっては、JD 製品情報をバッチで取得し、迅速にスクリーニング、比較、分析などを行う必要があります。現時点では、クローラー技術を使用する必要があります。この記事では、JD.com 製品情報を迅速にクロールできるようにするために、PHP 言語を使用してクローラーを作成する実装を紹介します。

  1. 準備

まず、PHP に必要なカール拡張機能をインストールし、一般的に使用される変数をいくつか設定する必要があります。具体的な手順は次のとおりです。

まず、ターミナルまたは PowerShell を開いて次のコマンドを入力して、curl 拡張機能パッケージをインストールします。

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

次に、いくつかの簡単な変数を後続のコードで使用しやすくするための PHP コード。たとえば、JD.com のアクセス アドレスを表す $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. 製品リストの取得

環境と必要な変数を準備したので、クローラーの作成を開始できます。まず、対象の JD 製品ページの製品リストを取得する必要があります。 CURL ツールと正規表現を使用して、JD.com 製品ページのアクセス アドレス (つまり $jgname) に基づいてターゲット リンクを取得できます。価格、レビュー数、製品名、製品番号などの製品情報をそれぞれ取得します。

具体的なコードは次のとおりです。

$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. 製品詳細の取得

これで、JD 製品表ページの製品リスト情報を取得できました。次のステップは、各製品の詳細情報を取得することです。それを $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>";
}

プロセス全体はこれで終わりです。実際のアプリケーションでは、例外処理の追加、リクエスト ヘッダーの設定、クロール速度の調整など、実際のニーズに基づいてコードに調整や最適化を行うことができます。つまり、これに基づいて、JD 製品情報を取得し、電子商取引の運用と分析をさらに支援するための安定した効率的なクローラーを構築できます。

以上が実践的なクローラー戦闘: PHP を使用して JD.com 製品情報をクロールするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。