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

PHP get_meta_tags()、cURL 與 User-Agent 實戰:抓取 Meta 標籤完整方案

     編輯:PHP 綜合知識

get_meta_tags() 限制

  • 僅解析 <meta name="..." content="..."> 格式,忽略 property、http-equiv、charset 等。
  • 遇到 </head> 停止解析。
  • 無法自訂 User-Agent,部分網站拒絕無 UA 或非瀏覽器 UA 的請求,導致回傳空值。

cURL 完整替代方案

function fetch_meta($url) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        CURLOPT_ENCODING       => 'gzip',      // 自動解壓
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_SSL_VERIFYPEER => false,       // 僅測試
    ]);
    $html = curl_exec($ch);
    curl_close($ch);

    if (!$html) return [];

    // 正則提取所有 meta
    $meta = [];
    if (preg_match_all('/]+)>/is', $html, $m)) {
        foreach ($m[1] as $attr) {
            $item = [];
            preg_match_all('/(name|property|http-equiv|content|charset)=["\']([^"\']+)["\']/', $attr, $mm, PREG_SET_ORDER);
            foreach ($mm as $mmm) $item[$mmm[1]] = $mmm[2];
            if (!empty($item['name'])) $meta[$item['name']] = $item['content'];
            elseif (!empty($item['property'])) $meta[$item['property']] = $item['content'];
            elseif (!empty($item['http-equiv'])) $meta[$item['http-equiv']] = $item['content'];
        }
    }
    return $meta;
}

print_r(fetch_meta('https://example.com'));

User-Agent 偽裝最佳實踐

  • 維護一組常見瀏覽器 UA 池,隨機抽取。
  • 尊重 robots.txt、Crawl-delay,避免高頻請求被封禁。
  • 生產環境啟用 CURLOPT_SSL_VERIFYPEER => true 並配置 CA 憑證。

現代替代:使用成熟解析庫

// composer require masterminds/html5
use Masterminds\HTML5;
$html5 = new HTML5();
$dom = $html5->loadHTML($html);
$metas = $dom->getElementsByTagName('meta');
foreach ($metas as $m) {
    $name = $m->getAttribute('name') ?: $m->getAttribute('property') ?: $m->getAttribute('http-equiv');
    if ($name) $meta[$name] = $m->getAttribute('content');
}

DOM 解析器比正則更健壯,支援 HTML5 標準、命名空間、錯誤容錯。

總結選型

需求推薦方案
簡單抓取標準 name/content metaget_meta_tags()(需確認目標站允許)
需自訂 UA、Cookie、Header、解壓cURL + 正則/DOM 解析
複雜頁面、HTML5、微資料DOM 解析器
大規模爬蟲Scrapy (Python) / Goutte (PHP) + 隊列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved