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