Doogle 是一個搜尋引擎和網路爬蟲,可以搜尋索引的網站和圖像,然後使用關鍵字進行搜尋。
主要以 OOP 風格的 PHP 編寫,旨在更好地理解 OOP 以及網路爬蟲的工作原理。
討論了兩種設定方法。
Docker 設定檔可在 doogle-docker 上找到。
假設您已經安裝並設定了 Docker v3.9(或更高版本)。
git clone https://github.com/safesploit/doogle-docker.git
cd doogle-docker
sh build.sh
現在可以透過 localhost:8000 存取 Doogle。
為了調試,phpMyAdmin 也已包含在 localhost:8001 上。
v1.0.0-beta.1 在 PHP 7.4、8.0 和 8.1 中受支援和測試。
Web伺服器、PHP伺服器和MySQL伺服器設定請參考XAMPP。 XAMPP 是最簡單的方法,因為使用 Doogle 需要多個伺服器。
XAMPP 上的 MySQL 安裝程式將使用 PHPMyAdmin 作為設定資料庫的 GUI 方法。
透過PHPMyAdmin > SQL標籤下的 PHPMyAdmin 登入資料庫後,可以將「doogle-tables-no-data.sql」的內容貼到該欄位中
mysql
pdo_mysql
使用強隨機密碼修改密碼PASSWORD_HERE 。
mysql> CREATE USER IF NOT EXISTS 'doogle'@'localhost' IDENTIFIED BY 'PASSWORD_HERE';
SQL 使用者「doogle」必須具有 SELECT、INSERT 和 UPDATE 權限:
mysql> GRANT SELECT, INSERT, UPDATE ON `doogle`.* TO 'doogle'@'localhost';
在檔案 config.php 中,必須為您的資料庫設定正確輸入以下內容:
$dbname = "doogle";
$dbhost = "localhost";
$dbuser = "doogle";
$dbpass = "";
在檔案「doogle-tables-no-data.sql」中,資料庫將會建立為「doogle」。
在瀏覽器中前往檔案所在的位置 http://localhost/crawl.php
將 URL 貼到輸入欄位中,然後按下「抓取」按鈕。
在crawl-manual.php的底部,變數$startUrl是貼上要抓取的網站URL的位置:
$startUrl = "https://thehackernews.com/";
然後在瀏覽器中前往檔案所在的位置 http://localhost/crawl-manual.php
抓取過程需要一些時間,這完全取決於被抓取網站的大小。該頁面將繼續載入(沒有輸出),直到crawl.php
腳本完成。
檢查資料庫中的表格images
和sites
以確保它們已被填入。
一旦表格填充完畢,請訪問 Doogle 主頁並進行搜尋!查看預覽圖像。
在search.php內部,實作了分頁
在上面的範例中,currentPage=11。顯示的頁數始終為 10。
網站搜尋每頁將傳回 20 個結果,圖像搜尋每頁將傳回 30 個結果。
每頁的結果可以分別在 search.php 中的第 {83, 88} 行變更。如 $pageSize 變數所示:
當沒有更多頁面可用時,可能會出現邊緣情況。
因此,對於 331 個結果,將有17 個頁面可用。然而,如果不考慮邊緣情況,分頁系統的 UI 將允許捲動瀏覽不存在的頁面;這將傳回一個空結果。
為了處理邊緣情況,在 while 迴圈中實作以下邏輯:
if($currentPage + $pagesLeft > $numPages + 1)
$currentPage = $numPages + 1 - $pagesLeft;
while($pagesLeft != 0 && $currentPage <= $numPages)
{ ... }
為了使圖像搜尋提供更多信息,“alt”標籤是搜尋詞的一部分。如./classes/ImageResultsProvider.php第34行所示
在“圖像”表中,有一行“已損壞”,用於追蹤返回錯誤的圖像。
由於映像已經透過純伺服器端解決方案加載,因此必須利用 AJAX 動態載入映像。顯示在 ./assets/js/script.js 中
影像搜尋使用 Masonry - 級聯網格佈局庫。
Masonry 允許圖像採用網格佈局,該佈局由於 jQuery 而具有響應性。下圖顯示了佈局範例:
如預覽圖像所示,Doogle 在執行網站搜尋時將為每個結果傳回(標題、URL 和描述)。
然而,為了使某些結果更易於閱讀,需要執行修剪過程。在 ./classes/SiteResultsProvider.php 中呼叫函數 trimField() :
標題被削減為 55 個字符,描述被削減為 230 個字符。
資料庫中的「images」和「sites」表都有一行,每一列都包含「clicks」。
每次造訪網站或預覽圖像時,「點擊次數」欄位都會增加。
執行搜尋時,傳回的結果會依點擊次數的降序排列。此行為由 ./classes/SiteResultsProvider.php 函數 getResultsHtml() 內的 $query 顯示。請參閱第 43 行。
爬行期間使用的使用者代理資料位於 ./classes/DomDocumentParser.php 內部。如第 9 行所示:
影像預覽是使用 Fancybox 完成的。
標題、圖像 URL 和網站 URL 位於左下角。
當然,某些搜尋字詞可能會傳回許多結果,例如「bbc」。
Doogle 每頁僅顯示20 個網站。在頁面底部,我們可以查看接下來的 10 頁。
用於提交 URL 進行爬行的 HTML 表單
Doogle 搜尋演示 - YouTube