2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<meta charset="utf-8" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
2021-03-05 08:46:32 +00:00
|
|
|
<title>searx_extra.standalone_searx — Searx Documentation (Searx-0.18.0.tex)</title>
|
|
|
|
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
|
|
|
<link rel="stylesheet" href="../../_static/searx.css" type="text/css" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/tabs.css" />
|
|
|
|
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
|
|
|
|
<script src="../../_static/jquery.js"></script>
|
|
|
|
<script src="../../_static/underscore.js"></script>
|
|
|
|
<script src="../../_static/doctools.js"></script>
|
|
|
|
<script src="../../_static/tabs.js"></script>
|
|
|
|
<link rel="index" title="Index" href="../../genindex.html" />
|
|
|
|
<link rel="search" title="Search" href="../../search.html" />
|
|
|
|
<script>DOCUMENTATION_OPTIONS.URL_ROOT = '../../';</script>
|
2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
</head><body>
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
|
|
<h3>Navigation</h3>
|
|
|
|
<ul>
|
|
|
|
<li class="right" style="margin-right: 10px">
|
2021-03-05 08:46:32 +00:00
|
|
|
<a href="../../genindex.html" title="General Index"
|
2020-11-04 13:12:59 +00:00
|
|
|
accesskey="I">index</a></li>
|
|
|
|
<li class="right" >
|
2021-03-05 08:46:32 +00:00
|
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
2020-11-04 13:12:59 +00:00
|
|
|
>modules</a> |</li>
|
2021-03-05 08:46:32 +00:00
|
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">Searx Documentation (Searx-0.18.0.tex)</a> »</li>
|
|
|
|
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
|
|
|
|
<li class="nav-item nav-item-this"><a href="">searx_extra.standalone_searx</a></li>
|
2020-11-04 13:12:59 +00:00
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
|
|
<div class="bodywrapper">
|
|
|
|
<div class="body" role="main">
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<h1>Source code for searx_extra.standalone_searx</h1><div class="highlight"><pre>
|
2020-11-04 13:12:59 +00:00
|
|
|
<span></span>#!/usr/bin/env python
|
|
|
|
"""Script to run searx from terminal.
|
|
|
|
|
|
|
|
Getting categories without initiate the engine will only return `['general']`
|
|
|
|
|
|
|
|
>>> import searx.engines
|
|
|
|
... list(searx.engines.categories.keys())
|
|
|
|
['general']
|
2020-12-17 10:53:16 +00:00
|
|
|
>>> import searx.search
|
|
|
|
... searx.search.initialize()
|
2020-11-04 13:12:59 +00:00
|
|
|
... list(searx.engines.categories.keys())
|
|
|
|
['general', 'it', 'science', 'images', 'news', 'videos', 'music', 'files', 'social media', 'map']
|
|
|
|
|
|
|
|
Example to use this script:
|
|
|
|
|
|
|
|
.. code:: bash
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
$ python3 searx_extra/standalone_searx.py rain
|
2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
Example to run it from python:
|
|
|
|
|
|
|
|
>>> import importlib
|
|
|
|
... import json
|
|
|
|
... import sys
|
|
|
|
... import searx.engines
|
2020-12-17 10:53:16 +00:00
|
|
|
... import searx.search
|
2020-11-04 13:12:59 +00:00
|
|
|
... search_query = 'rain'
|
|
|
|
... # initialize engines
|
2020-12-17 10:53:16 +00:00
|
|
|
... searx.search.initialize()
|
2020-11-04 13:12:59 +00:00
|
|
|
... # load engines categories once instead of each time the function called
|
|
|
|
... engine_cs = list(searx.engines.categories.keys())
|
|
|
|
... # load module
|
|
|
|
... spec = importlib.util.spec_from_file_location(
|
|
|
|
... 'utils.standalone_searx', 'utils/standalone_searx.py')
|
|
|
|
... sas = importlib.util.module_from_spec(spec)
|
|
|
|
... spec.loader.exec_module(sas)
|
|
|
|
... # use function from module
|
|
|
|
... prog_args = sas.parse_argument([search_query], category_choices=engine_cs)
|
|
|
|
... search_q = sas.get_search_query(prog_args, engine_categories=engine_cs)
|
|
|
|
... res_dict = sas.to_dict(search_q)
|
|
|
|
... sys.stdout.write(json.dumps(
|
|
|
|
... res_dict, sort_keys=True, indent=4, ensure_ascii=False,
|
|
|
|
... default=sas.json_serial))
|
|
|
|
{
|
|
|
|
"answers": [],
|
|
|
|
"infoboxes": [ {...} ],
|
|
|
|
"paging": true,
|
|
|
|
"results": [... ],
|
|
|
|
"results_number": 820000000.0,
|
|
|
|
"search": {
|
|
|
|
"lang": "all",
|
|
|
|
"pageno": 1,
|
|
|
|
"q": "rain",
|
|
|
|
"safesearch": 0,
|
|
|
|
"timerange": null
|
|
|
|
},
|
|
|
|
"suggestions": [...]
|
|
|
|
}
|
|
|
|
""" # noqa: E501
|
|
|
|
# pylint: disable=pointless-string-statement
|
|
|
|
'''
|
|
|
|
searx is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
searx is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with searx. If not, see < http://www.gnu.org/licenses/ >.
|
|
|
|
|
|
|
|
(C) 2016- by Alexandre Flament, <alex@al-f.net>
|
|
|
|
'''
|
|
|
|
# pylint: disable=wrong-import-position
|
|
|
|
import argparse
|
|
|
|
import sys
|
|
|
|
from datetime import datetime
|
|
|
|
from json import dumps
|
|
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
|
|
import searx
|
|
|
|
import searx.preferences
|
|
|
|
import searx.query
|
|
|
|
import searx.search
|
|
|
|
import searx.webadapter
|
|
|
|
|
|
|
|
EngineCategoriesVar = Optional[List[str]]
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<div class="viewcode-block" id="get_search_query"><a class="viewcode-back" href="../../searx_extra/standalone_searx.py.html#searx_extra.standalone_searx.get_search_query">[docs]</a>def get_search_query(
|
2020-11-04 13:12:59 +00:00
|
|
|
args: argparse.Namespace, engine_categories: EngineCategoriesVar = None
|
|
|
|
) -> searx.search.SearchQuery:
|
|
|
|
"""Get search results for the query"""
|
|
|
|
if engine_categories is None:
|
|
|
|
engine_categories = list(searx.engines.categories.keys())
|
|
|
|
try:
|
|
|
|
category = args.category.decode('utf-8')
|
|
|
|
except AttributeError:
|
|
|
|
category = args.category
|
|
|
|
form = {
|
|
|
|
"q": args.query,
|
|
|
|
"categories": category,
|
|
|
|
"pageno": str(args.pageno),
|
|
|
|
"language": args.lang,
|
|
|
|
"time_range": args.timerange
|
|
|
|
}
|
|
|
|
preferences = searx.preferences.Preferences(
|
|
|
|
['oscar'], engine_categories, searx.engines.engines, [])
|
|
|
|
preferences.key_value_settings['safesearch'].parse(args.safesearch)
|
|
|
|
|
|
|
|
search_query = searx.webadapter.get_search_query_from_webapp(
|
|
|
|
preferences, form)[0]
|
|
|
|
return search_query</div>
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<div class="viewcode-block" id="no_parsed_url"><a class="viewcode-back" href="../../searx_extra/standalone_searx.py.html#searx_extra.standalone_searx.no_parsed_url">[docs]</a>def no_parsed_url(results: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
2020-11-04 13:12:59 +00:00
|
|
|
"""Remove parsed url from dict."""
|
|
|
|
for result in results:
|
|
|
|
del result['parsed_url']
|
|
|
|
return results</div>
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<div class="viewcode-block" id="json_serial"><a class="viewcode-back" href="../../searx_extra/standalone_searx.py.html#searx_extra.standalone_searx.json_serial">[docs]</a>def json_serial(obj: Any) -> Any:
|
2020-11-04 13:12:59 +00:00
|
|
|
"""JSON serializer for objects not serializable by default json code.
|
|
|
|
|
|
|
|
:raise TypeError: raised when **obj** is not serializable
|
|
|
|
"""
|
|
|
|
if isinstance(obj, datetime):
|
|
|
|
serial = obj.isoformat()
|
|
|
|
return serial
|
|
|
|
if isinstance(obj, bytes):
|
|
|
|
return obj.decode('utf8')
|
|
|
|
if isinstance(obj, set):
|
|
|
|
return list(obj)
|
|
|
|
raise TypeError("Type ({}) not serializable".format(type(obj)))</div>
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<div class="viewcode-block" id="to_dict"><a class="viewcode-back" href="../../searx_extra/standalone_searx.py.html#searx_extra.standalone_searx.to_dict">[docs]</a>def to_dict(search_query: searx.search.SearchQuery) -> Dict[str, Any]:
|
2020-11-04 13:12:59 +00:00
|
|
|
"""Get result from parsed arguments."""
|
|
|
|
result_container = searx.search.Search(search_query).search()
|
|
|
|
result_container_json = {
|
|
|
|
"search": {
|
|
|
|
"q": search_query.query,
|
|
|
|
"pageno": search_query.pageno,
|
|
|
|
"lang": search_query.lang,
|
|
|
|
"safesearch": search_query.safesearch,
|
|
|
|
"timerange": search_query.time_range,
|
|
|
|
},
|
|
|
|
"results": no_parsed_url(result_container.get_ordered_results()),
|
|
|
|
"infoboxes": result_container.infoboxes,
|
|
|
|
"suggestions": list(result_container.suggestions),
|
|
|
|
"answers": list(result_container.answers),
|
|
|
|
"paging": result_container.paging,
|
|
|
|
"results_number": result_container.results_number()
|
|
|
|
}
|
|
|
|
return result_container_json</div>
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<div class="viewcode-block" id="parse_argument"><a class="viewcode-back" href="../../searx_extra/standalone_searx.py.html#searx_extra.standalone_searx.parse_argument">[docs]</a>def parse_argument(
|
2020-11-04 13:12:59 +00:00
|
|
|
args: Optional[List[str]]=None,
|
|
|
|
category_choices: EngineCategoriesVar=None
|
|
|
|
) -> argparse.Namespace:
|
|
|
|
"""Parse command line.
|
|
|
|
|
|
|
|
:raise SystemExit: Query argument required on `args`
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
>>> import importlib
|
|
|
|
... # load module
|
|
|
|
... spec = importlib.util.spec_from_file_location(
|
|
|
|
... 'utils.standalone_searx', 'utils/standalone_searx.py')
|
|
|
|
... sas = importlib.util.module_from_spec(spec)
|
|
|
|
... spec.loader.exec_module(sas)
|
|
|
|
... sas.parse_argument()
|
|
|
|
usage: ptipython [-h] [--category [{general}]] [--lang [LANG]] [--pageno [PAGENO]] [--safesearch [{0,1,2}]] [--timerange [{day,week,month,year}]]
|
|
|
|
query
|
|
|
|
SystemExit: 2
|
|
|
|
>>> sas.parse_argument(['rain'])
|
|
|
|
Namespace(category='general', lang='all', pageno=1, query='rain', safesearch='0', timerange=None)
|
|
|
|
""" # noqa: E501
|
|
|
|
if not category_choices:
|
|
|
|
category_choices = list(searx.engines.categories.keys())
|
|
|
|
parser = argparse.ArgumentParser(description='Standalone searx.')
|
|
|
|
parser.add_argument('query', type=str,
|
|
|
|
help='Text query')
|
|
|
|
parser.add_argument('--category', type=str, nargs='?',
|
|
|
|
choices=category_choices,
|
|
|
|
default='general',
|
|
|
|
help='Search category')
|
|
|
|
parser.add_argument('--lang', type=str, nargs='?', default='all',
|
|
|
|
help='Search language')
|
|
|
|
parser.add_argument('--pageno', type=int, nargs='?', default=1,
|
|
|
|
help='Page number starting from 1')
|
|
|
|
parser.add_argument(
|
|
|
|
'--safesearch', type=str, nargs='?',
|
|
|
|
choices=['0', '1', '2'], default='0',
|
|
|
|
help='Safe content filter from none to strict')
|
|
|
|
parser.add_argument(
|
|
|
|
'--timerange', type=str,
|
|
|
|
nargs='?', choices=['day', 'week', 'month', 'year'],
|
|
|
|
help='Filter by time range')
|
|
|
|
return parser.parse_args(args)</div>
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2020-12-17 10:53:16 +00:00
|
|
|
searx.search.initialize()
|
2020-11-04 13:12:59 +00:00
|
|
|
engine_cs = list(searx.engines.categories.keys())
|
|
|
|
prog_args = parse_argument(category_choices=engine_cs)
|
|
|
|
search_q = get_search_query(prog_args, engine_categories=engine_cs)
|
|
|
|
res_dict = to_dict(search_q)
|
|
|
|
sys.stdout.write(dumps(
|
|
|
|
res_dict, sort_keys=True, indent=4, ensure_ascii=False,
|
|
|
|
default=json_serial))
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
<div class="clearer"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span id="sidebar-top"></span>
|
|
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
|
|
<div class="sphinxsidebarwrapper">
|
|
|
|
|
|
|
|
|
2021-03-05 08:46:32 +00:00
|
|
|
<p class="logo"><a href="../../index.html">
|
|
|
|
<img class="logo" src="../../_static/searx_logo_small.png" alt="Logo"/>
|
2020-11-04 13:12:59 +00:00
|
|
|
</a></p>
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Project Links</h3>
|
|
|
|
<ul>
|
|
|
|
<li><a href="https://github.com/searx/searx">Source</a>
|
|
|
|
|
|
|
|
<li><a href="https://github.com/searx/searx/wiki">Wiki</a>
|
|
|
|
|
2021-01-12 09:55:12 +00:00
|
|
|
<li><a href="https://searx.space">Public instances</a>
|
2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
<li><a href="https://twitter.com/Searx_engine">Twitter</a>
|
2021-01-12 09:55:12 +00:00
|
|
|
|
|
|
|
<li><a href="https://github.com/searx/searx/issues">Issue Tracker</a>
|
2020-11-04 13:12:59 +00:00
|
|
|
</ul><h3>Navigation</h3>
|
|
|
|
<ul>
|
2021-03-05 08:46:32 +00:00
|
|
|
<li><a href="../../index.html">Overview</a>
|
2020-11-04 13:12:59 +00:00
|
|
|
<ul>
|
2021-03-05 08:46:32 +00:00
|
|
|
<li><a href="../index.html">Module code</a>
|
2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
<div id="searchbox" style="display: none" role="search">
|
|
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
|
|
<div class="searchformwrapper">
|
2021-03-05 08:46:32 +00:00
|
|
|
<form class="search" action="../../search.html" method="get">
|
2020-11-04 13:12:59 +00:00
|
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
|
|
<input type="submit" value="Go" />
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script>$('#searchbox').show(0);</script>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="clearer"></div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="footer" role="contentinfo">
|
|
|
|
© Copyright 2015-2020, Adam Tauber, Noémi Ványi.
|
2021-02-24 12:55:43 +00:00
|
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.5.1.
|
2020-11-04 13:12:59 +00:00
|
|
|
</div>
|
2021-03-05 08:46:32 +00:00
|
|
|
<script src="../../_static/version_warning_offset.js"></script>
|
2020-11-04 13:12:59 +00:00
|
|
|
|
|
|
|
</body>
|
|
|
|
</html>
|