首頁  >  文章  >  後端開發  >  PHP 爬蟲實戰:從百度搜尋結果中擷取所需數據

PHP 爬蟲實戰:從百度搜尋結果中擷取所需數據

PHPz
PHPz原創
2023-06-13 10:22:402036瀏覽

隨著網路高速發展,資訊爆炸的時代已經來臨。在這樣的時代,搜尋引擎成為了我們獲取資訊的主要工具,而這些搜尋引擎所提供的大量數據讓我們難以想像。然而,對於一些特定領域的研究者或數據分析員來說,他們所需要的資訊可能只是這些搜尋結果中的一小部分數據。在這種情況下,我們需要使用爬蟲程序來準確地獲得我們想要的數據。

在本文中,我們將使用 PHP 編寫一個簡單的爬蟲程序,從百度搜尋結果中提取我們所需的資料。這個程式的核心是使用 PHP 的 cURL 函式庫模擬 HTTP 請求,然後使用正規表示式等方法解析 HTML 頁面。

想法

在開始寫爬蟲程式之前,我們需要先明確幾個問題:

  1. 目標:我們想要從百度搜尋結果頁中爬取什麼數據?
  2. URL:我們需要取得哪個 URL 下的資料?
  3. 資料格式:百度搜尋結果頁的資料是什麼格式?

在考慮我們需要取得哪些資料時,讓我們以「PHP 爬蟲」這個關鍵字為例。如果我們在百度上搜尋這個關鍵字,我們能夠看到以下資訊:

  • 搜尋結果的總數量
  • 每個搜尋結果的標題
  • 每個搜尋結果的描述
  • 每個搜尋結果的網址

那麼,我們就可以將我們的目標定義為從百度搜尋結果中提取出每個結果的標題、描述和網址。

取得資料的第一步就是要明確我們要取得的 URL。在我們的例子中,我們需要取得的 URL 是這樣的:https://www.baidu.com/s?wd=php 爬蟲。透過在百度搜尋列中輸入“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 程式碼片段中,可以看到每個搜尋結果都嵌套在e0e7649d1c55f416bf62f64a22dbf767 標籤內。每個搜尋結果都有一個標題,對應的 HTML 格式為 ff4e2ec8753d5ab7a1c6a9335e730d21,其中連結位址嵌套在 3499910bf9dac5ae3c52d5ede7383485 標籤內。每個搜尋結果都有一個描述,對應的 HTML 格式為 21677049e5b751d69b1465bbd638c12a。每個搜尋結果還有一個網址,在 3499910bf9dac5ae3c52d5ede7383485 標籤內含有 class="c-showurl"

現在我們已經明確了我們要取得到的資料的格式及我們需要解析的 HTML 資料的格式,我們已經可以開始編寫我們的爬蟲程式了。

編寫程式碼

我們將我們的PHP 爬蟲程式碼分成了三個步驟:

  1. 取得百度搜尋結果的HTML 頁面
  2. 解析HTML 頁面
  3. 將解析後的資料以陣列形式傳回

取得百度搜尋結果的HTML 頁面

我們可以使用PHP 的cURL 函式庫傳送HTTP 請求,從而取得百度搜尋結果的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 頁面

在取得了百度搜尋結果的 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;
}

我們可以接收一個關鍵字作為參數,然後調用這個函數來獲取這個關鍵字在百度搜尋結果中的標題、描述和連結。

結論

在本文中,我們使用 PHP 編寫了一個簡單的爬蟲程序,從百度搜尋結果中提取所需資料。這個程式使用 PHP 的 cURL 函式庫模擬 HTTP 請求,並使用正規表示式等方法來解析 HTML 頁面。透過這個例子,我們可以深入了解爬蟲程式是如何運作的,以及如何使用 PHP 來編寫爬蟲程式。在實際的專案中,我們可以根據需求修改這個程式來取得我們需要的資料。

以上是PHP 爬蟲實戰:從百度搜尋結果中擷取所需數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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