[mod] duckduckgo engine: better support of the language preference

After the main request, send a second to https://duckduckgo.com/t/sl_h

See https://github.com/searx/searx/issues/2259
This commit is contained in:
Alexandre Flament 2021-02-09 14:36:43 +01:00
parent 74d56f6cfb
commit d2dac11392

View file

@ -5,7 +5,8 @@
from lxml.html import fromstring from lxml.html import fromstring
from json import loads from json import loads
from searx.utils import extract_text, match_language, eval_xpath from searx.utils import extract_text, match_language, eval_xpath, dict_subset
from searx.poolrequests import get
# about # about
about = { about = {
@ -35,6 +36,7 @@ language_aliases = {
# search-url # search-url
url = 'https://html.duckduckgo.com/html' url = 'https://html.duckduckgo.com/html'
url_ping = 'https://duckduckgo.com/t/sl_h'
time_range_dict = {'day': 'd', time_range_dict = {'day': 'd',
'week': 'w', 'week': 'w',
'month': 'm'} 'month': 'm'}
@ -65,27 +67,27 @@ def request(query, params):
params['url'] = url params['url'] = url
params['method'] = 'POST' params['method'] = 'POST'
params['data']['b'] = ''
params['data']['q'] = query params['data']['q'] = query
params['data']['df'] = '' params['data']['b'] = ''
region_code = get_region_code(params['language'], supported_languages) region_code = get_region_code(params['language'], supported_languages)
if region_code: if region_code:
params['data']['kl'] = region_code params['data']['kl'] = region_code
params['cookies']['kl'] = region_code params['cookies']['kl'] = region_code
if params['time_range'] in time_range_dict:
params['data']['df'] = time_range_dict[params['time_range']]
params['data']['df'] = time_range_dict.get(params['time_range'], '')
return params return params
# get response from search-request # get response from search-request
def response(resp): def response(resp):
# ping
headers_ping = dict_subset(resp.request.headers, ['User-Agent', 'Accept-Encoding', 'Accept', 'Cookie'])
get(url_ping, headers=headers_ping)
# parse the response
results = [] results = []
doc = fromstring(resp.text) doc = fromstring(resp.text)
# parse results
for i, r in enumerate(eval_xpath(doc, result_xpath)): for i, r in enumerate(eval_xpath(doc, result_xpath)):
if i >= 30: if i >= 30:
break break