From 7c5789dff2ac4c30591e1007308b9a1ffd7fabfa Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 12 Dec 2023 00:46:42 +0000 Subject: [PATCH] Implement brave search scraper --- engines/text/brave.php | 50 +++++++++++++++++++++++++++++++++++++++-- engines/text/google.php | 2 +- engines/text/text.php | 6 ++++- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/engines/text/brave.php b/engines/text/brave.php index 22a9921..d21a28c 100644 --- a/engines/text/brave.php +++ b/engines/text/brave.php @@ -1,7 +1,23 @@ query)); + + $results_language = $this->opts->language; + $number_of_results = $this->opts->number_of_results; + + $url = "https://search.brave.com/search?q=$query_encoded&nfpr=1&start=$this->page"; + + if (3 > strlen($results_language) && 0 < strlen($results_language)) { + $url .= "&lr=lang_$results_language"; + $url .= "&hl=$results_language"; + } + + if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) + $url .= "&num=$number_of_results"; + + if (isset($_COOKIE["safe_search"])) + $url .= "&safe=medium"; return $url; } @@ -13,8 +29,38 @@ if (!$xpath) return $results; - // TODO implement brave search scraper + foreach($xpath->query("//div[@id='results']//div[contains(@class, 'snippet')]") as $result) { + $url = $xpath->evaluate(".//a[contains(@class, 'h')]//@href", $result)[0]; + if ($url == null) + continue; + + $url = $url->textContent; + + if (!empty($results) && array_key_exists("url", $results) && end($results)["url"] == $url->textContent) + continue; + + $title = $xpath->evaluate(".//a[contains(@class, 'h')]//div[contains(@class, 'url')]", $result)[0]; + + if ($title == null) + continue; + $title = $title->textContent; + + $description = $xpath->evaluate(".//div[contains(@class, 'snippet-content')]//div[contains(@class, 'snippet-description')]", $result)[0]->textContent; + + array_push($results, + array ( + "title" => htmlspecialchars($title), + "url" => htmlspecialchars($url), + // base_url is to be removed in the future, see #47 + "base_url" => htmlspecialchars(get_base_url($url)), + "description" => $description == null ? + TEXTS["result_no_description"] : + htmlspecialchars($description) + ) + ); + + } return $results; } diff --git a/engines/text/google.php b/engines/text/google.php index b664542..5ce877d 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -46,7 +46,7 @@ if ($url == null) continue; - if (!empty($results) && array_key_exists("url", $results) && end($results)["url"] == $url->textContent) + if (!empty($results) && array_key_exists("url", $results) && end($results)["url"] == $url->textContent) continue; $url = $url->textContent; diff --git a/engines/text/text.php b/engines/text/text.php index 15960e3..6a31fd3 100644 --- a/engines/text/text.php +++ b/engines/text/text.php @@ -14,7 +14,6 @@ check_ddg_bang($this->query, $opts); if ($this->engine == "google") { - require "engines/text/google.php"; $this->engine_request = new GoogleRequest($opts, $mh); } @@ -24,6 +23,11 @@ $this->engine_request = new DuckDuckGoRequest($opts, $mh); } + if ($this->engine == "brave") { + require "engines/text/brave.php"; + $this->engine_request = new BraveSearchRequest($opts, $mh); + } + if (has_cooldown($this->engine, $this->opts->cooldowns) && !has_cached_results($this->engine_request->url)) { // TODO dont add it in the first place curl_multi_remove_handle($mh, $this->engine_request->ch);