本文將詳細講解如何用PHP和cURL高效抓取新聞列表和詳情頁內容。主要挑戰在于:一、從列表頁提取新聞標題和完整URL;二、根據列表頁URL,進一步抓取詳情頁內容,最終整合標題、URL和內容進行展示。
首先,解決從列表頁獲取新聞標題和完整URL的問題。通過分析列表頁源代碼,我們可以利用正則表達式匹配標簽中的href屬性和title屬性(如果存在)來提取新聞標題和相對路徑。由于提取的路徑通常是相對路徑,我們需要將其轉換為完整URL。這需要在代碼中添加網站根域名。
<?php $url = 'http://www.xx.com/news'; // 列表頁URL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, ''); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // ... 其他cURL選項 ... $html = curl_exec($ch); curl_close($ch); preg_match_all('/<a href="https://www.php.cn/link/01bebc8e971d09cb90cf5756b340f24c".*??>(.*?)/s', $html, $matches); $newslist = []; foreach ($matches[1] as $key => $relativepath) { $completepath = $url . '/' . ltrim($relativepath, '/'); // 轉換為完整URL $newslist[] = [ 'title' => $matches[2][$key], 'url' => $completepath, ]; } // 現在 $newslist 數組包含標題和完整URL var_dump($newslist); ?>
接下來是第二個挑戰:從詳情頁提取新聞內容。同樣,我們使用cURL獲取詳情頁HTML,然后使用正則表達式提取
內的內容作為新聞內容。需要注意的是,正則表達式需要根據具體的詳情頁HTML結構進行調整。
立即學習“PHP免費學習筆記(深入)”;
<?php foreach ($newslist as $news) { $ch = curl_init($news['url']); // ... 其他cURL選項 ... $detailHtml = curl_exec($ch); curl_close($ch); preg_match('/<div class="content text-xs">(.*?)</div>/s', $detailHtml, $contentMatch); $content = isset($contentMatch[1]) ? $contentMatch[1] : ''; // 處理無內容的情況 // 輸出結果 echo "標題: " . $news['title'] . "n"; echo "鏈接: " . $news['url'] . "n"; echo "內容: " . $content . "nn"; } ?>
這段代碼展示了如何使用cURL和正則表達式完成新聞列表和詳情的抓取。請根據實際網站結構調整正則表達式,并添加必要的錯誤處理和異常處理。 記住,在抓取數據時,務必遵守網站的robots.txt規則和相關法律法規。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END