隨著網路的發展,資訊爆炸性成長,而新聞是其中佔比最高的一類資訊。為了更快地獲取最新、最有價值的新聞訊息,人們通常會去瀏覽新聞網站上的最新資訊。然而,一個人每天所能閱讀的新聞總量是有限的,因此,我們需要一個高效的工具來爬取新聞資訊。本文將分享一種利用 PHP 實現的爬蟲程式來爬取新浪新聞的實務經驗。
一、爬蟲基礎知識
爬蟲是一種自動化程序,其功能是模擬瀏覽器發出請求,解析返回的頁面數據,抽取需要的資訊並進行保存或下載。常見的爬蟲程式語言有 Python、Java、JavaScript 等。本文選擇 PHP 語言來編寫爬蟲程序,原因是 PHP 語言非常適合用於 Web 開發,而且它有許多強大的 HTTP 請求函數與 DOM 解析庫,可以方便地完成網頁抓取與資訊提取。
二、寫爬蟲程式
1.確定目標網站
在開始寫爬蟲程式之前,需要先確定你要爬取的目標網站。本文選擇的是新浪新聞網站。首先,我們需要了解一下該網站的網頁結構與資料儲存方式。
2.模擬瀏覽器發出請求
要想成功地獲取目標網站的數據,需要模擬瀏覽器向目標網站發出請求。在 PHP 中,我們可以使用 cURL 函數函式庫來完成這個過程。例如:
$url = 'http://news.sina.com.cn/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, ''); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $html = curl_exec($ch); curl_close($ch);
這段程式碼利用 cURL 發出一個 GET 請求,請求地址為新浪新聞的首頁。我們可以看到,在請求中使用了一些參數,例如:CURLOPT_RETURNTRANSFER
用於告訴cURL 函數要傳回請求結果而不是直接將其輸出到瀏覽器;CURLOPT_USERAGENT
用於模擬瀏覽器的身份,讓目標網站不會防範我們的爬蟲;CURLOPT_FOLLOWLOCATION
用於自動追蹤重定向,以便能夠取得到完整的頁面原始碼等。
3.解析頁面資料
在成功取得到頁面原始碼後,我們需要解析資料並提取所需的資訊。解析過程可以分為兩個步驟:首先,將 HTML 程式碼轉換成 DOM 對象,反映了文件結構的層次關係;然後,再從 DOM 對像根據對應的語法規則篩選出所需的資訊。
在 PHP 中,我們可以藉助 DOMDocument 類別與 SimpleXMLElement 類別來解析 HTML 和 XML 程式碼。例如,在以下程式碼片段中,我們從新浪新聞首頁中提取出了新聞標題、連結和摘要:
//创建 DOM 对象 $dom = new DOMDocument(); //HTML 代码转 DOM 对象 $dom->loadHTML($html); //获取所有新闻列表 $newsList = $dom->getElementById('syncad_1'); //遍历新闻列表并提取信息 foreach ($newsList->getElementsByTagName('li') as $item) { //提取标题链接 $linkNode = $item->getElementsByTagName('a')->item(0); $link = $linkNode->getAttribute('href'); //提取标题 $titleNode = $linkNode->getElementsByTagName('span')->item(0); $title = $titleNode->nodeValue; //提取摘要 $summaryNode = $item->getElementsByTagName('p')->item(0); $summary = $summaryNode->nodeValue; //保存数据到数组中 $data[] = [ 'title' => $title, 'link' => $link, 'summary' => $summary ]; }
在上面的程式碼範例中,我們首先使用getElementById
方法取得到所有的新聞列表,然後使用getElementsByTagName
方法篩選出其中的li 元素,並遍歷該列表以提取所需資訊。其中,我們使用了 getAttribute
方法和 nodeValue
方法來提取屬性值和文字內容。
4.儲存資料
成功提取所需資訊後,我們需要將其儲存到本機檔案或資料庫中以便後續的使用。在本文中,我們使用了 MySQL 資料庫來保存數據,並使用了 PHP 自帶的 PDO 擴充功能來實現與資料庫的連接與操作。以下是保存資料到 MySQL 資料庫中的程式碼範例:
//数据库连接 $dsn = 'mysql:host=127.0.0.1;dbname=news;charset=utf8'; $username = 'root'; $password = '123456'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]; $pdo = new PDO($dsn, $username, $password, $options); //保存数据到数据库中 $stmt = $pdo->prepare("INSERT INTO news (title, link, summary) VALUES (:title, :link, :summary)"); foreach ($data as $item) { $stmt->bindParam(':title', $item['title']); $stmt->bindParam(':link', $item['link']); $stmt->bindParam(':summary', $item['summary']); $stmt->execute(); }
在上述程式碼中,我們首先建立了一個名為 news 的表,用於保存新聞的標題、連結和摘要資訊。之後,利用 PDO 函數庫實現對 MySQL 資料庫的連線、預處理、參數綁定、執行等步驟。這裡我們使用了 bindParam
方法來綁定參數並執行 SQL 語句。
三、總結
本文介紹如何利用 PHP 語言編寫一個爬蟲程序,以爬取新浪新聞網站的實例進行說明。在這個過程中,範例程式碼中共包括了爬取目標、發出請求、解析資料、保存資料等步驟。在實務中,可能還需要考慮一些網站反爬措施、資料清洗、多執行緒爬取等問題,但是這些都屬於更高階的爬蟲技術,可在以後的學習中深入研究。
以上是爬取新浪新聞的 PHP 爬蟲實戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!