Doogle은 색인된 웹사이트와 이미지를 검색한 다음 키워드를 사용하여 나중에 검색할 수 있는 검색 엔진이자 웹 크롤러입니다.
OOP와 웹 크롤러 작동 방식을 더 잘 이해할 목적으로 주로 OOP 스타일 PHP로 작성되었습니다.
두 가지 설정 방법에 대해 설명합니다.
Docker 구성 파일은 doogle-docker에서 사용할 수 있습니다.
이미 Docker v3.9(또는 그 이상)이 설치 및 구성되어 있다고 가정합니다.
git clone https://github.com/safesploit/doogle-docker.git
cd doogle-docker
sh build.sh
이제 localhost:8000을 통해 Google에 액세스할 수 있습니다.
디버깅을 위해 phpMyAdmin도 localhost:8001에 포함되었습니다.
v1.0.0-beta.1은 PHP 7.4, 8.0 및 8.1에서 지원되고 테스트되었습니다.
웹 서버, 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을 붙여넣고 크롤링 버튼을 누르세요.
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개의 결과를 반환합니다.
페이지당 결과는 각각 {83, 88}행에서 search.php 내에서 변경할 수 있습니다. $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 그리드 레이아웃 라이브러리를 사용하고 있습니다.
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'와 같은 많은 결과를 반환할 수 있습니다.
Google에서는 페이지당 20개의 사이트 만 표시합니다. 페이지 하단에서 다음 10페이지를 볼 수 있습니다.
크롤링을 위해 URL을 제출하는 HTML 양식
Google 검색 데모 - YouTube