summaryrefslogtreecommitdiff
path: root/searx
diff options
context:
space:
mode:
Diffstat (limited to 'searx')
-rw-r--r--searx/engines/searchrockit.py88
-rw-r--r--searx/settings.yml26
2 files changed, 114 insertions, 0 deletions
diff --git a/searx/engines/searchrockit.py b/searx/engines/searchrockit.py
new file mode 100644
index 000000000..90858ee4d
--- /dev/null
+++ b/searx/engines/searchrockit.py
@@ -0,0 +1,88 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+"""SearchRockit is an American search engine. It allegedly has its own index,
+but the results seem to come from Google."""
+
+import typing as t
+from urllib.parse import urlencode
+from lxml import html
+from dateutil import parser
+
+from searx.result_types import EngineResults
+from searx.utils import (
+ eval_xpath_list,
+ extract_text,
+ eval_xpath,
+)
+
+if t.TYPE_CHECKING:
+ from searx.search.processors import OnlineParams
+ from searx.extended_types import SXNG_Response
+
+about = {
+ "website": "https://searchrockit.com",
+ "official_api_documentation": None,
+ "use_official_api": False,
+ "require_api_key": False,
+ "results": "HTML",
+}
+
+categories = ["general"]
+paging = True
+
+SearchrockitCateg = t.Literal["web", "images", "news"]
+searchrockit_categ: SearchrockitCateg = "web"
+
+base_url = "https://searchrockit.com"
+
+
+def setup(_):
+ if searchrockit_categ not in t.get_args(SearchrockitCateg):
+ raise ValueError("invalid search category: %s" % searchrockit_categ)
+
+
+def request(query: str, params: "OnlineParams") -> None:
+ args = {"q": query, "p": params["pageno"]}
+ params["url"] = f"{base_url}/results/{searchrockit_categ}?{urlencode(args)}"
+
+
+def response(resp: "SXNG_Response") -> EngineResults:
+ doc = html.fromstring(resp.text)
+ res = EngineResults()
+
+ match searchrockit_categ:
+ case "web" | "news":
+ for result in eval_xpath_list(
+ doc, "//div[contains(@class, 'results-list')]/div[contains(@class, 'result-item')]"
+ ):
+ publishedDate = None
+ try:
+ d = extract_text(eval_xpath(result, ".//span[contains(@class, 'result-item--publishedAt')]")) or ""
+ publishedDate = parser.parse(d)
+ except parser.ParserError:
+ pass
+ res.add(
+ res.types.MainResult(
+ url=extract_text(eval_xpath(result, ".//a[contains(@class, 'result-item--title')]/@href")),
+ title=extract_text(eval_xpath(result, ".//a[contains(@class, 'result-item--title')]")) or "",
+ content=extract_text(eval_xpath(result, ".//a[contains(@class, 'result-item--desc')]")) or "",
+ thumbnail=extract_text(
+ eval_xpath(result, ".//a[contains(@class, 'result-item--thumb')]/img/@src")
+ )
+ or "",
+ publishedDate=publishedDate,
+ )
+ )
+ case "images":
+ for result in eval_xpath_list(
+ doc, "//div[contains(@class, 'image-grid')]/a[contains(@class, 'image-card')]"
+ ):
+ res.add(
+ res.types.Image(
+ url=extract_text(eval_xpath(result, "./@href")),
+ title=extract_text(eval_xpath(result, "./div[contains(@class, 'image-title')]")) or "",
+ thumbnail_src=extract_text(eval_xpath(result, "./img/@src")) or "",
+ img_src=extract_text(eval_xpath(result, "./@data-full-url")) or "",
+ )
+ )
+
+ return res
diff --git a/searx/settings.yml b/searx/settings.yml
index ae4d5dd9d..ad557842a 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -2171,6 +2171,32 @@ engines:
about:
website: https://searchmysite.net
+ - name: searchrockit
+ engine: searchrockit
+ categories: general
+ searchrockit_categ: web
+ shortcut: sr
+ disabled: true
+ inactive: true
+
+ - name: searchrockit images
+ engine: searchrockit
+ categories: images
+ searchrockit_categ: images
+ shortcut: sri
+ # took up to 60s when testing
+ timeout: 10
+ disabled: true
+ inactive: true
+
+ - name: searchrockit news
+ engine: searchrockit
+ categories: news
+ searchrockit_categ: news
+ shortcut: srn
+ disabled: true
+ inactive: true
+
- name: selfhst icons
engine: selfhst
shortcut: si