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

PHP 采集網頁郵箱地址:正則匹配提取頁面中所有 Email 的輕量級爬蟲代碼

     編輯:PHP 綜合知識

核心代碼(20 行實現)

<?php
$url = 'https://www.jb51.net'; // 目標網頁
$content = file_get_contents($url); // 獲取 HTML

function getEmail($str) {
    // 正則模式:匹配標準郵箱格式
    // [a-z0-9\-_\.]+  用戶名部分
    // @               必須符號
    // [a-z0-9]+       域名主體
    // \.              點分隔
    // [a-z0-9\-_\.]+  頂級域/子域
    $pattern = "/([a-z0-9\-_\.]+@[a-z0-9]+\.[a-z0-9\-_\.]+)/i";
    
    preg_match_all($pattern, $str, $emailArr);
    return $emailArr[0]; // 返回完整匹配數組
}

$emails = getEmail($content);
print_r($emails);

輸出示例

Array
(
    [0] => admin@jb51.net
    [1] => service@jb51.net
    [2] => contact@sub.jb51.net
)

正則模式深度解析

片段含義匹配示例
[a-z0-9\-_\.]+用戶名:字母、數字、中劃線、下劃線、點user.name, user_name, user-name
@字面符號 @@
[a-z0-9]+域名主標籤:至少一個字母/數字gmail, 163, qq
\.字面點號(轉義).
[a-z0-9\-_\.]+頂級域/子域:支持多級域名com, co.uk, sub.domain.cn
/i大小寫不敏感匹配 Admin@Domain.COM

進階增強版(支持更多 RFC 5322 規範)

function getEmailAdvanced($html) {
    // 更嚴格模式:排除連續點、首尾點、IP 域名等異常
    $pattern = "/
        (?:^|[\s\<\>\(\)\[\]\{\}\;\:\,\"\'])  # 左邊界
        (
            [a-z0-9!#\$%&'*+\/=?^_`\{|\}~-]+     # 用戶名
            (?:\.[a-z0-9!#\$%&'*+\/=?^_`\{|\}~-]+)* # 允許點但不連續/首尾
            @
            (?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ # 域名標籤
            [a-z0-9](?:[a-z0-9-]*[a-z0-9])?       # 頂級域
        )
        (?:$|[\s\<\>\(\)\[\]\{\}\;\:\,\"\'])      # 右邊界
    /ix";
    
    preg_match_all($pattern, $html, $matches);
    return array_unique($matches[1]); // 去重
}

實戰注意事項

  • 反爬蟲:目標站可能有 User-Agent 檢測、IP 限流、JS 渲染,需模擬瀏覽器 Header 或使用 Selenium/Puppeteer
  • 編碼處理:file_get_contents 獲取的內容可能非 UTF-8,配合 mb_detect_encoding + iconv 轉碼
  • 去重與驗證:結果 array_unique,可進一步 SMTP 驗證郵箱真實性
  • 法律合規:遵守 robots.txt、站點服務條款,僅用於合法數據分析,嚴禁垃圾郵件收集
  • 性能:大頁面正則匹配較慢,考慮 DOM 解析器(DOMDocument、QueryList)定向提取

擴展:批量采集多個 URL

$urls = ['https://site1.com', 'https://site2.com', ...];
$allEmails = [];

foreach ($urls as $url) {
    try {
        $html = @file_get_contents($url);
        if ($html) {
            $emails = getEmail($html);
            $allEmails = array_merge($allEmails, $emails);
            echo "[$url] 發現 " . count($emails) . " 個郵箱\n";
        }
    } catch (Exception $e) {
        echo "[$url] 失敗: " . $e->getMessage() . "\n";
    }
    usleep(500000); // 禮貌延遲 0.5s
}

$allEmails = array_unique($allEmails);
file_put_contents('emails.txt', implode("\n", $allEmails));
echo "總計去重郵箱: " . count($allEmails);

幾十行代碼即可構建基礎郵箱采集器,配合進階正則、異步並發、代理池可擴展為生產級爬蟲系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved