Doogle は、インデックス付けされた Web サイトや画像を検索し、後で検索するキーワードを使用できる検索エンジンおよび Web クローラーです。
OOP と Web クローラーの仕組みをより深く理解することを目的として、主に OOP スタイルの PHP で書かれています。
2 つのセットアップ方法について説明します。
Docker 構成ファイルは doogle-docker で入手できます。
すでに Docker v3.9 (またはそれ以降) がインストールされ、構成されていると仮定します。
git clone https://github.com/safesploit/doogle-docker.git
cd doogle-docker
sh build.sh
Doogle は localhost:8000 経由でアクセスできるようになりました。
デバッグ用に、phpMyAdmin も localhost:8001 に含まれています。
v1.0.0-beta.1 は、PHP 7.4、8.0、および 8.1 でサポートおよびテストされています。
Webサーバー、PHPサーバー、MySQLサーバーの構成については、XAMPPを参照してください。 Doogle を使用するには複数のサーバーが必要なため、XAMPP が最も簡単な方法です。
XAMPP での MySQL セットアップは、データベースをセットアップする GUI メソッドとして PHPMyAdmin を使用します。
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 を入力フィールドに貼り付けて、[クロール] ボタンを押します。
roll-manual.php の下部にある変数 $startUrl は、クロールする Web サイトの URL を貼り付ける場所です。
$startUrl = "https://thehackernews.com/";
次に、ブラウザでファイルがホストされている場所 http://localhost/crawl-manual.php に移動します。
クロールプロセスには時間がかかりますが、それはクロールされる Web サイトのサイズに完全に依存します。ページは、 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 行目に示されているように
「images」テーブルには、エラーを返したイメージを追跡する「broken」行があります。
画像は純粋なサーバー側ソリューションですでに読み込まれているため、AJAX を利用して画像を動的に読み込む必要があります。これは ./assets/js/script.js に表示されます
画像検索は、Masonry - Cascading Grid Layout Library を使用しています。
Masonry では、jQuery により応答性の高いグリッド レイアウトを画像に使用できます。以下の画像はレイアウトの例を示しています。
プレビュー画像に示されているように、Doogle はサイト検索を実行すると、各結果に対して (タイトル、URL、説明) を返します。
ただし、一部の結果を読みやすくするためにトリミング処理が実行されます。 ./classes/SiteResultsProvider.php 内で、関数 TrimField() が呼び出されます。
タイトルは 55 文字でトリミングされ、説明は 230 文字でトリミングされます。
データベース内の「images」テーブルと「sites」テーブルの両方に、各列の「クリック」を含む行があります。
「クリック数」フィールドは、サイトにアクセスするたび、または画像がプレビューされるたびに増加します。
検索を実行すると、返される結果はクリック数の降順に整理されます。この動作は、./classes/SiteResultsProvider.php 関数 getResultsHtml() 内の $query によって示されます。 43 行目を参照してください。
./classes/DomDocumentParser.php 内には、クロール中に使用されるユーザー エージェント データが配置されます。 9 行目に示されているように:
画像のプレビューはFancyboxを使用して行われます。
タイトル、画像の URL、サイトの URL は左下隅に表示されます。
当然のことながら、特定の検索語では「bbc」のような多くの結果が返される場合があります。
Doogle では 1 ページあたり20 サイトしか表示されません。ページの下部で、次の 10 ページを表示できます。
クロール用の URL を送信するための HTML フォーム
Doogle 検索のデモ - YouTube