首頁  >  文章  >  後端開發  >  爬取新浪新聞的 PHP 爬蟲實戰

爬取新浪新聞的 PHP 爬蟲實戰

WBOY
WBOY原創
2023-06-13 14:55:121025瀏覽

隨著網路的發展,資訊爆炸性成長,而新聞是其中佔比最高的一類資訊。為了更快地獲取最新、最有價值的新聞訊息,人們通常會去瀏覽新聞網站上的最新資訊。然而,一個人每天所能閱讀的新聞總量是有限的,因此,我們需要一個高效的工具來爬取新聞資訊。本文將分享一種利用 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中文網其他相關文章!

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