ホームページ  >  記事  >  バックエンド開発  >  PHP クローラーの実践: Baidu の検索結果から必要なデータを抽出する

PHP クローラーの実践: Baidu の検索結果から必要なデータを抽出する

PHPz
PHPzオリジナル
2023-06-13 10:22:402038ブラウズ

インターネットの急速な発展により、情報爆発の時代が到来しました。このような時代において、検索エンジンは私たちが情報を取得するための主要なツールとなり、検索エンジンから得られる膨大なデータは私たちの想像を超えています。ただし、特定の分野の研究者やデータ アナリストにとって、必要な情報はこれらの検索結果のデータのほんの一部である可能性があります。この場合、必要なデータを正確に取得するにはクローラーを使用する必要があります。

この記事では、PHP を使用して、Baidu の検索結果から必要なデータを抽出する簡単なクローラー プログラムを作成します。このプログラムの核心は、PHP の cURL ライブラリを使用して HTTP リクエストをシミュレートし、正規表現やその他のメソッドを使用して HTML ページを解析することです。

アイデア

クローラー プログラムの作成を開始する前に、いくつかの質問を明確にする必要があります。

  1. 目標: Baidu の検索結果ページからクロールする必要があります。どのようなデータですか?
  2. URL: データを取得するにはどの URL が必要ですか?
  3. データ形式: Baidu の検索結果ページのデータの形式は何ですか?

どのようなデータを取得する必要があるかを考えるとき、キーワード「PHP クローラー」を例に考えてみましょう。このキーワードを Baidu で検索すると、次の情報が表示されます。

  • 検索結果の総数
  • #各検索結果のタイトル
  • 各検索結果の説明検索結果
  • 各検索結果の URL

次に、Baidu の検索結果、説明、URL から各結果のタイトルを抽出することを目標として定義できます。

データを取得するための最初のステップは、取得したい URL を明確にすることです。この例では、取得する必要がある URL は次のとおりです: https://www.baidu.com/s?wd=php クローラー。 Baidu の検索バーに「php クローラー」と入力すると、この URL に自動的にジャンプできます。

次に、解析するデータの形式を理解する必要があります。この場合、検索結果は次のような HTML コードの形式で存在します。

<div class="result c-container ">
    <h3 class="t">
        <a href="http://www.example.com/" target="_blank" class="c-showurl">
            www.example.com
        </a>
        <em>PHP</em> 爬虫是什么? - PHP 入门教程 - 极客学院
    </h3>
    <div class="c-abstract">
        <span class=" newTimeFactor_before_abs">2天前 - </span>
        <em>PHP</em> 爬虫是一种方便快捷的数据采集方式 ... 目前的爬虫主要是通过<a
            href="https://www.baidu.com/s?wd=python%20爬虫&amp;rsp=1&amp;f=8&amp;ie=utf-8&amp;tn=95754739_hao_pg"
            target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a"
            target="_blank" class="text-underline">PHP</a>,<a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns
            isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;
            wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a" target="_blank"
            class="text-underline">PHP</a> 一般用作...
    </div>
</div>

上記の HTML コード スニペットでは、各検索結果が e0ad1f608bf39c4174aba30001edb678 に対応するタイトルがあり、リンク アドレスは 3499910bf9dac5ae3c52d5ede7383485 タグ内にネストされます。各検索結果には、HTML 形式 <div class="c-abstract"> に対応する説明が付いています。各検索結果には、<code>3499910bf9dac5ae3c52d5ede7383485 タグ内に class="c-showurl" を含む URL も含まれています。

取得したいデータの形式と解析する必要がある HTML データの形式が明確になったので、クローラー プログラムの作成を開始できます。

コードの記述

PHP クローラー コードを 3 つのステップに分割しました:

  1. Baidu 検索結果の HTML ページを取得する
  2. 分析 HTML ページ
  3. 解析されたデータを配列形式で返します

Baidu 検索結果の HTML ページを取得します

PHP の cURL ライブラリを使用して HTTP リクエストを送信できます。 Baidu の検索結果の HTML ページを取得します。この例では、検索ページの URL を $url 変数に保存します。次に、cURL ハンドルを作成し、URL の設定、リクエスト ヘッダーの設定、プロキシの設定、タイムアウトの設定、リクエスト メソッドの GET への設定などの多くのオプションを設定し、最後にこのハンドルを実行して HTML ページを取得します。

<?php

$url = "https://www.baidu.com/s?wd=php%20爬虫";

// 创建curl句柄
$ch = curl_init();

// 设置curl选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt(
    $ch,
    CURLOPT_HTTPHEADER,
    [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        'Referer: https://www.baidu.com/',
        'Connection: keep-alive',
    ]
);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

//执行curl句柄
$result = curl_exec($ch);

この例では、cURL ライブラリによって提供されるオプションの多くを使用します。たとえば、ブラウザによって送信される HTTP リクエストをシミュレートするリクエスト ヘッダーを設定したり、リクエスト メソッドを GET に設定したり、タイムアウトを設定したりできます。

HTML ページの解析

Baidu 検索結果の HTML ページを取得した後、それを解析して必要な情報を取得する必要があります。この例では、PHP の正規表現を使用して HTML ページを解析します。

次は、HTML ページからタイトル、説明、リンクを抽出するために使用する正規表現です:

<?php

$result = curl_exec($ch);

// 匹配所有搜索结果
preg_match_all(
    '/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/',
    $result,
    $matches
);

// 提取搜索结果中的标题、描述和链接
$data = [];
for ($i=0; $i<count($matches[0]); $i++) {
    $data[] = [
        'title' => strip_tags($matches[2][$i]), // 去除标题中的 HTML 标签
        'description' => strip_tags($matches[3][$i]), // 去除描述中的 HTML 标签
        'link' => $matches[1][$i]
    ];
};

// 关闭curl句柄
curl_close($ch);

上記のコードでは、PHP の正規表現を使用してすべての検索結果と一致します。次に、ループを使用してすべての検索結果を調べ、必要なタイトル、説明、リンクを抽出します。 HTML から取得したタイトルと説明には HTML タグが含まれるため、strip_tags 関数を使用してそれらを削除します。

結果を返す

上記のコードでは、必要なデータを取得しました。後は結果を配列の形式で返すだけです。クローラー プログラム全体を関数にカプセル化し、取得したデータを配列の形式で返します。

<?php

function spider_baidu($keyword) {
    $url = "https://www.baidu.com/s?wd=" . urlencode($keyword);

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt(
        $ch,
        CURLOPT_HTTPHEADER,
        [
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
            'Referer: https://www.baidu.com/',
            'Connection: keep-alive',
        ]
    );
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

    $result = curl_exec($ch);

    preg_match_all(
        '/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/',
        $result,
        $matches
    );

    $data = [];
    for ($i=0; $i<count($matches[0]); $i++) {
        $data[] = [
            'title' => strip_tags($matches[2][$i]),
            'description' => strip_tags($matches[3][$i]),
            'link' => $matches[1][$i]
        ];
    };

    curl_close($ch);

    return $data;
}

キーワードをパラメーターとして受け取り、この関数を呼び出してタイトルのキーワードを取得できます。 Baidu の検索結果の説明とリンク。

結論

この記事では、PHP を使用して、Baidu の検索結果から必要なデータを抽出する簡単なクローラー プログラムを作成しました。このプログラムは、PHP の cURL ライブラリを使用して HTTP リクエストをシミュレートし、正規表現などのメソッドを使用して HTML ページを解析します。この例を通じて、クローラーがどのように動作するか、および PHP を使用してクローラーを作成する方法を深く理解できます。実際のプロジェクトでは、必要に応じてこのプログラムを変更して、必要なデータを取得できます。

以上がPHP クローラーの実践: Baidu の検索結果から必要なデータを抽出するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

関連記事

続きを見る