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

PHP 簡易網頁爬蟲類:遞歸抓取鏈接並限制深度

     編輯:PHP 綜合知識

類設計

class crawler {
    private $_depth = 5;
    private $_urls = [];
    private $_started = false;

    function extract_links($url) {
        if (!$this->_started) { $this->_started = true; $curr_depth = 0; }
        else $curr_depth++;
        if ($curr_depth < $this->_depth) {
            $data = file_get_contents($url);
            if (preg_match_all('/((?:http|https):\/\/(?:www\.)*(?:[a-zA-Z0-9_-]{1,15}.+[a-zA-Z0-9_]{1,}){1,}(?:[a-zA-Z0-9_\/\.-?&:%,!;]*))/', $data, $urls12)) {
                foreach ($urls12[0] as $k => $v) {
                    $check = get_headers($v, 1);
                    if (strstr($v, $url) && $check[0] == 'HTTP/1.1 200 OK' && !in_array($v, $this->_urls) && $curr_depth < $this->_depth) {
                        $this->_urls[] = $v;
                        $this->extract_links($v);
                    }
                }
            }
        }
        return $this->_urls;
    }
}

使用示例

$crawler = new crawler();
$links = $crawler->extract_links('https://example.com');
print_r($links);

局限性

  • 僅支援同域名鏈接(strstr($v, $url)),跨域需調整邏輯。
  • file_get_contents 無超時控制,易卡死;建議改用 cURL + 超時。
  • 無 User-Agent 偽裝,易被反爬蟲攔截。
  • 遞歸深度受 PHP 棧限制,超深站點可能報錯。

生產級爬蟲建議使用 Guzzle + 佇列 + 去重集合(Redis/Bloom Filter)架構。

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