on master help sign in
[fix] fetch extra search param of gigablast - fixes #1293
e5305f8Adam Tauber
searx/engines/gigablast.py+28−13
@@ -14,6 +14,7 @@ import random
14from json import loads
14from json import loads
15from time import time
15from time import time
16from lxml.html import fromstring
16from lxml.html import fromstring
17+from searx.poolrequests import get
17from searx.url_utils import urlencode
18from searx.url_utils import urlencode
18from searx.utils import eval_xpath
19from searx.utils import eval_xpath
19
20
@@ -31,13 +32,9 @@ search_string = 'search?{query}'\
31 '&c=main'\
32 '&c=main'\
32 '&s={offset}'\
33 '&s={offset}'\
33 '&format=json'\
34 '&format=json'\
34− '&qh=0'\
35+ '&langcountry={lang}'\
35− '&qlang={lang}'\
36 '&ff={safesearch}'\
36 '&ff={safesearch}'\
37− '&rxiec={rxieu}'\
38− '&ulse={ulse}'\
39− '&rand={rxikd}'\
37+ '&rand={rxikd}'
40− '&dbez={dbez}'
41# specific xpath variables
38# specific xpath variables
42results_xpath = '//response//result'
39results_xpath = '//response//result'
43url_xpath = './/url'
40url_xpath = './/url'
@@ -46,9 +43,26 @@ content_xpath = './/sum'
46
43
47supported_languages_url = 'https://gigablast.com/search?&rxikd=1'
44supported_languages_url = 'https://gigablast.com/search?&rxikd=1'
48
45
46+extra_param = '' # gigablast requires a random extra parameter
47+# which can be extracted from the source code of the search page
48+
49+
50+def parse_extra_param(text):
51+ global extra_param
52+ param_lines = [x for x in text.splitlines() if x.startswith('var url=') or x.startswith('url=url+')]
53+ extra_param = ''
54+ for l in param_lines:
55+ extra_param += l.split("'")[1]
56+ extra_param = extra_param.split('&')[-1]
57+
58+
59+def init(engine_settings=None):
60+ parse_extra_param(get('http://gigablast.com/search?c=main&qlangcountry=en-us&q=south&s=10').text)
61+
49
62
50# do search-request
63# do search-request
51def request(query, params):
64def request(query, params):
65+ print("EXTRAPARAM:", extra_param)
52 offset = (params['pageno'] - 1) * number_of_results
66 offset = (params['pageno'] - 1) * number_of_results
53
67
54 if params['language'] == 'all':
68 if params['language'] == 'all':
@@ -67,14 +81,11 @@ def request(query, params):
67 search_path = search_string.format(query=urlencode({'q': query}),
81 search_path = search_string.format(query=urlencode({'q': query}),
68 offset=offset,
82 offset=offset,
69 number_of_results=number_of_results,
83 number_of_results=number_of_results,
70− rxikd=int(time() * 1000),
71− rxieu=random.randint(1000000000, 9999999999),
72− ulse=random.randint(100000000, 999999999),
73 lang=language,
84 lang=language,
74− safesearch=safesearch,
85+ rxikd=int(time() * 1000),
75− dbez=random.randint(100000000, 999999999))
86+ safesearch=safesearch)
76
87
77− params['url'] = base_url + search_path
88+ params['url'] = base_url + search_path + '&' + extra_param
78
89
79 return params
90 return params
80
91
@@ -84,7 +95,11 @@ def response(resp):
84 results = []
95 results = []
85
96
86 # parse results
97 # parse results
98+ try:
87− response_json = loads(resp.text)
99+ response_json = loads(resp.text)
100+ except:
101+ parse_extra_param(resp.text)
102+ return results
88
103
89 for result in response_json['results']:
104 for result in response_json['results']:
90 # append result
105 # append result