首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 採集程序核心技術全解析:從入門到實戰

     編輯:PHP 相關知識

採集程序核心思路

網頁採集(爬蟲)本質是「HTTP 請求 + 內容提取 + 數據存儲」的自動化流程。核心三步驟:

  1. 獲取遠程源碼: `file_get_contents()`、`fopen()` 或 cURL;
  2. 提取目標內容: 正則表達式、DOM 解析、XPath、CSS 選擇器;
  3. 後續處理: 入庫、下載圖片/文件、去重、增量更新。

實際項目中,常需多層級採集:先抓列表頁提取詳情頁 URL,再逐個抓取詳情頁解析具體字段。

核心代碼片段

1. 基礎採集:獲取頁面並正則提取

<?php
$url = 'https://example.com/games/list.html';
$html = @file_get_contents($url);
if ($html === false) die("獲取失敗");

// 提取 SWF 遊戲鏈接:var url = "gameswf/xxx.swf";
preg_match_all('/var url = "gameswf\/(.*?)\.swf";/is', $html, $matches);
$swfFiles = $matches[1]; // 數組:['game1', 'game2', ...]

// 入庫示例(建議用 PDO 預處理防注入)
$pdo = new PDO("mysql:host=localhost;dbname=cms;charset=utf8", "user", "pass");
$stmt = $pdo->prepare("INSERT INTO games (name, swf_path) VALUES (?, ?)");
foreach ($swfFiles as $name) {
    $stmt->execute([$name, "gameswf/$name.swf"]);
}
echo "入庫完成,共 " . count($swfFiles) . " 條";
?>

2. 文件下載:圖片/Flash 存本地

<?php
// 簡單版:copy() 直接複製(需 allow_url_fopen=On)
$remote = 'https://cdn.example.com/images/logo.png';
$local  = '/var/www/html/uploads/logo.png';
if (@copy($remote, $local)) {
    echo "下載成功";
} else {
    echo "下載失敗";
}

// 進階版:支持大文件、斷點續傳、偽造 Referer
function downloadFile($url, $savePath, $referer = '') {
    $ch = curl_init($url);
    $fp = fopen($savePath, 'wb');
    curl_setopt_array($ch, [
        CURLOPT_FILE => $fp,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_CONNECTTIMEOUT => 20,
        CURLOPT_REFERER => $referer,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Collector)',
        CURLOPT_SSL_VERIFYPEER => false, // 僅測試環境
    ]);
    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    fclose($fp);
    return $result && $httpCode === 200;
}
?>

3. 通用圖片下載函數(帶校驗)

<?php
/**
 * 下載圖片並保存
 * @param string $url 圖片完整 URL
 * @param string $saveName 不含副檔名的保存文件名(路徑+基礎名)
 * @return string|false 成功返回完整文件名,失敗返回 false
 */
function saveImage($url, $saveName) {
    if (empty($url)) return false;
    
    // 1. 校驗副檔名
    $ext = strtolower(strrchr($url, '.'));
    if (!in_array($ext, ['.gif', '.jpg', '.jpeg', '.png', '.webp'])) {
        return false; // 非圖片鏈接
    }
    
    // 2. 獲取二進制內容
    $imgData = @file_get_contents($url);
    if ($imgData === false || strlen($imgData) < 100) { // 過濾 1x1 像素佔位圖
        return false;
    }
    
    // 3. 寫入文件
    $fullName = $saveName . $ext;
    $dir = dirname($fullName);
    if (!is_dir($dir)) mkdir($dir, 0755, true);
    
    if (file_put_contents($fullName, $imgData) !== false) {
        return $fullName;
    }
    return false;
}
?>

實戰經驗總結(避坑指南)

  1. 拒絕反盜鏈站點: 偽造 Referer 成本高且易失效,優先採集無保護站點;
  2. 選擇響應快的源站: 甚至可在本地搭建鏡像庫離線採集;
  3. 分階段入庫: 先存原始 HTML/關鍵字段,後台異步清洗詳情,提高採集吞吐量;
  4. 完善重試機制: 同一 URL 連續失敗 3 次自動跳過,記錄日誌供人工介入;
  5. 入庫前清洗: 過濾 XSS 腳本、廣告代碼、空標籤、非法字符,防止污染數據庫;
  6. 去重策略: 基於 URL 唯一索引、內容 MD5 指紋、標題+來源複合鍵;
  7. 遵守 robots.txt 與法律: 控制抓取頻率(`sleep(1~3)`),不採集隱私數據,商業用途需授權。

現代化採集工具鏈推薦

  • Guzzle + Symfony DomCrawler: PHP 現代 HTTP 客戶端 + 強大選擇器;
  • Laravel Dusk / Puppeteer (Node.js): 渲染 JS 動態頁面;
  • Scrapy (Python): 企業級分布式爬蟲框架,生態成熟;
  • PHPSpider / Phpspider: 國產 PHP 爬蟲框架,配置化開發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved