花了幾天時間鑽研,終於理清了 PHP 采集程式的核心邏輯。這裡將心得整理分享,希望能為同樣在探索路上的開發者提供參考,也歡迎大神指正補充。
說白了,采集程式的流程非常直觀:獲取列表頁 → 提取目標鏈接 → 遍歷詳情頁 → 提取內容 → 入庫或後續處理。雖然步驟簡單,但每個環節都藏著不少坑。下面以一個實際案例——採集 https://www.jb51.net/article/11/index.htm 這個列表頁下的所有文章——來逐步拆解。
常用 fopen() 或 file_get_contents()。以 fopen() 為例:
$source = fopen("https://www.jb51.net/article/11/index.htm", 'r');
$content = fread($source, 99999); // 讀取足夠大的字節數
fclose($source);
此時 $content 就是完整的 HTML 源碼字串,可直接寫入文件驗證。
通過查看源碼發現,文章鏈接結構為:
<div class="in_arttitle"><a href="https://www.jb51.net/article/10/all/273.1.htm">標題內容</a>
編寫正則:
$count = preg_match_all('/<div class="in_arttitle"><a\s+href="(.+?)">(.+?)<\/a>/', $content, $art_list);
$art_list[1] 存放所有文章 URL$art_list[2] 存放對應標題這一步搞定,采集任務已成功一半。
網上大多數教程到這裡就戛然而止,但實際專案中必須面對「翻頁」與「批量請求」的問題。初期我嘗試用 for 循環直接 fopen,結果頻繁報錯「請求失敗」;改用 JavaScript 刷新頁面也無濟於事。
最終發現關鍵在於 分批發起請求,避免單次腳本執行超時。核心代碼:
echo "<META HTTP-EQUIV=REFRESH CONTENT='0;URL=aa.php?id=1'>";
原理:腳本處理完一頁後,輸出這行 Meta 標籤,瀏覽器自動跳轉到 aa.php?id=2,以此類推。URL 參數 id 作為頁碼計數器,實現「一頁一請求、請求間隔可控」的效果,繞過 PHP max_execution_time 限制,也避免了對目標服務器造成過大壓力。
fopen、fread、正則提取正文、入庫ini_set('user_agent', 'Mozilla/5.0 ...')iconv('GB2312', 'UTF-8', $content) 統一編碼sleep(1~3) 隨機休眠,尊重目標站點 robots.txt對大神來說這或許只是基礎操作,但對初學者而言,搞清「如何跨頁循環」往往是從「能跑通 Demo」到「能上線項目」的關鍵一步。希望這篇記錄能幫你少走彎路。代碼即人生,持續優化,方得始終。