瀏覽代碼

[enh] engine types

asciimoo 11 年之前
父節點
當前提交
d793c2733c

+ 1
- 1
examples/basic_engine.py 查看文件

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

+ 0
- 7
searx/__init__.py 查看文件

@@ -1,7 +0,0 @@
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 查看文件

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

+ 12
- 7
searx/engines/duckduckgo.py 查看文件

@@ -1,14 +1,19 @@
1
-from lxml import html
1
+from json import loads
2 2
 
3 3
 
4 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 6
     return params
9 7
 
10 8
 
11 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 查看文件

@@ -1,5 +1,4 @@
1 1
 import json
2
-from searx import base_result_template
3 2
 
4 3
 def request(query, params):
5 4
     params['url'] = 'http://api.duckduckgo.com/?q=%s&format=json&pretty=0' % query
@@ -10,10 +9,11 @@ def response(resp):
10 9
     search_res = json.loads(resp.text)
11 10
     results = []
12 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 19
     return results

+ 3
- 1
searx/static/css/style.css 查看文件

@@ -8,7 +8,9 @@ html {
8 8
 
9 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 15
 .result_title { margin-bottom: 0; }
14 16
 

+ 4
- 1
searx/templates/results.html 查看文件

@@ -5,6 +5,9 @@
5 5
     <input type="submit" value="search" />
6 6
 </form>
7 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 12
 {% endfor %}
10 13
 {% endblock %}