隨著網路高速發展,資訊爆炸的時代已經來臨。在這樣的時代,搜尋引擎成為了我們獲取資訊的主要工具,而這些搜尋引擎所提供的大量數據讓我們難以想像。然而,對於一些特定領域的研究者或數據分析員來說,他們所需要的資訊可能只是這些搜尋結果中的一小部分數據。在這種情況下,我們需要使用爬蟲程序來準確地獲得我們想要的數據。
在本文中,我們將使用 PHP 編寫一個簡單的爬蟲程序,從百度搜尋結果中提取我們所需的資料。這個程式的核心是使用 PHP 的 cURL 函式庫模擬 HTTP 請求,然後使用正規表示式等方法解析 HTML 頁面。
在開始寫爬蟲程式之前,我們需要先明確幾個問題:
在考慮我們需要取得哪些資料時,讓我們以「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爬虫&rsp=1&f=8&ie=utf-8&tn=95754739_hao_pg" target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a>,<a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt& wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a> 一般用作... </div> </div>
在以上HTML 程式碼片段中,可以看到每個搜尋結果都嵌套在<div class ="result c-container ">
標籤內。每個搜尋結果都有一個標題,對應的 HTML 格式為 <h3 class="t">
,其中連結位址嵌套在 <a>
標籤內。每個搜尋結果都有一個描述,對應的 HTML 格式為 <div class="c-abstract">
。每個搜尋結果還有一個網址,在 <a>
標籤內含有 class="c-showurl"
。
現在我們已經明確了我們要取得到的資料的格式及我們需要解析的 HTML 資料的格式,我們已經可以開始編寫我們的爬蟲程式了。
我們將我們的PHP 爬蟲程式碼分成了三個步驟:
我們可以使用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 頁面之後,我們需要解析它來取得我們需要的資訊。在這個範例中,我們將使用 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中文網其他相關文章!