Browse Source

[enh] engine types

asciimoo 11 years ago
parent
commit
d793c2733c

+ 1
- 1
examples/basic_engine.py View File

17
     '''post-response callback
17
     '''post-response callback
18
     resp: requests response object
18
     resp: requests response object
19
     '''
19
     '''
20
-    return [resp.text]
20
+    return [{'url': '', 'title': '', 'content': ''}]
21
 
21
 

+ 0
- 7
searx/__init__.py View File

1
-
2
-base_result_template = """
3
-<div class="result">
4
-    <h3 class="result_title"><a href="{url}">{title}</a></h3>
5
-    <p class="content">{content}<br />{url}</p>
6
-</div>
7
-"""

+ 8
- 6
searx/engines/__init__.py View File

6
 
6
 
7
 engine_dir = dirname(realpath(__file__))
7
 engine_dir = dirname(realpath(__file__))
8
 
8
 
9
-engines = []
9
+engines = {}
10
 
10
 
11
 for filename in listdir(engine_dir):
11
 for filename in listdir(engine_dir):
12
     modname = splitext(filename)[0]
12
     modname = splitext(filename)[0]
16
     engine = load_source(modname, filepath)
16
     engine = load_source(modname, filepath)
17
     if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
17
     if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
18
         continue
18
         continue
19
-    engines.append(engine)
19
+    engines[modname] = engine
20
 
20
 
21
 def default_request_params():
21
 def default_request_params():
22
     return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
22
     return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
23
 
23
 
24
-def make_callback(results, callback):
24
+def make_callback(engine_name, results, callback):
25
     def process_callback(response, **kwargs):
25
     def process_callback(response, **kwargs):
26
-        results.extend(callback(response))
26
+        for result in callback(response):
27
+            result['engine'] = engine_name
28
+            results.append(result)
27
     return process_callback
29
     return process_callback
28
 
30
 
29
 def search(query, request):
31
 def search(query, request):
31
     requests = []
33
     requests = []
32
     results = []
34
     results = []
33
     user_agent = request.headers.get('User-Agent', '')
35
     user_agent = request.headers.get('User-Agent', '')
34
-    for engine in engines:
36
+    for ename, engine in engines.items():
35
         headers = default_request_params()
37
         headers = default_request_params()
36
         headers['User-Agent'] = user_agent
38
         headers['User-Agent'] = user_agent
37
         request_params = engine.request(query, headers)
39
         request_params = engine.request(query, headers)
38
-        callback = make_callback(results, engine.response)
40
+        callback = make_callback(ename, results, engine.response)
39
         if request_params['method'] == 'GET':
41
         if request_params['method'] == 'GET':
40
             req = grequests.get(request_params['url']
42
             req = grequests.get(request_params['url']
41
                                 ,headers=headers
43
                                 ,headers=headers

+ 12
- 7
searx/engines/duckduckgo.py View File

1
-from lxml import html
1
+from json import loads
2
 
2
 
3
 
3
 
4
 def request(query, params):
4
 def request(query, params):
5
-    params['method']    = 'POST'
6
-    params['url']       = 'https://duckduckgo.com/html'
7
-    params['data']['q'] = query
5
+    params['url'] = 'https://duckduckgo.com/d.js?q=%s&l=us-en&p=1&s=0' % query
8
     return params
6
     return params
9
 
7
 
10
 
8
 
11
 def response(resp):
9
 def response(resp):
12
-    dom = html.fromstring(resp.text)
13
-    results = dom.xpath('//div[@class="results_links results_links_deep web-result"]')
14
-    return [html.tostring(x) for x in results]
10
+    results = []
11
+    search_res = loads(resp.text[resp.text.find('[{'):-2])[:-1]
12
+    for r in search_res:
13
+        if not r.get('t'):
14
+            continue
15
+        results.append({'title': r['t']
16
+                       ,'content': r['a']
17
+                       ,'url': r['u']
18
+                       })
19
+    return results

+ 6
- 6
searx/engines/duckduckgo_definitions.py View File

1
 import json
1
 import json
2
-from searx import base_result_template
3
 
2
 
4
 def request(query, params):
3
 def request(query, params):
5
     params['url'] = 'http://api.duckduckgo.com/?q=%s&format=json&pretty=0' % query
4
     params['url'] = 'http://api.duckduckgo.com/?q=%s&format=json&pretty=0' % query
10
     search_res = json.loads(resp.text)
9
     search_res = json.loads(resp.text)
11
     results = []
10
     results = []
12
     if 'Definition' in search_res:
11
     if 'Definition' in search_res:
13
-        res = {'title'   : search_res.get('Heading', '')
14
-              ,'content' : search_res.get('Definition', '')
15
-              ,'url'     : search_res.get('AbstractURL', '')
16
-              }
17
-        results.append(base_result_template.format(**res))
12
+        if search_res.get('AbstractURL'):
13
+            res = {'title'   : search_res.get('Heading', '')
14
+                  ,'content' : search_res.get('Definition', '')
15
+                  ,'url'     : search_res.get('AbstractURL', '')
16
+                  }
17
+            results.append(res)
18
 
18
 
19
     return results
19
     return results

+ 3
- 1
searx/static/css/style.css View File

8
 
8
 
9
 h1 { font-size: 5em; }
9
 h1 { font-size: 5em; }
10
 
10
 
11
-input { border: 2px solid #8888FF; padding: 8px; background-color: #FFFFFF; font-size: 1.6em; }
11
+input { border: 2px solid #8888FF; padding: 8px; background-color: #FFFFFF; font-size: 1.3em; }
12
+
13
+a { text-decoration: none; }
12
 
14
 
13
 .result_title { margin-bottom: 0; }
15
 .result_title { margin-bottom: 0; }
14
 
16
 

+ 4
- 1
searx/templates/results.html View File

5
     <input type="submit" value="search" />
5
     <input type="submit" value="search" />
6
 </form>
6
 </form>
7
 {% for result in results %}
7
 {% for result in results %}
8
-    <p>{{ result|safe }}</p>
8
+    <div class="result">
9
+        <h3 class="result_title"><a href="{{ result.url }}">{{ result.title|safe }}</a></h3>
10
+        <p class="content"><span class="engine">{{ result.engine }}</span><br />{% if result.content %}{{ result.content|safe }}<br />{% endif %}<span class="url">{{ result.url }}</span></p>
11
+    </div>
9
 {% endfor %}
12
 {% endfor %}
10
 {% endblock %}
13
 {% endblock %}