on master help sign in
Merge pull request #2560 from dalf/fix-duckduckgo

Fix duckduckgo

commit7e83818879a48fef84a518092d833e3785c64ff2 authorAlexandre Flament <alex@al-f.net> dateFri 12 Feb 2021, 10:56 (6 years ago) parent63d6ccfd2dac11
2 files changed+17−13
searx/engines/duckduckgo.py+10−8 searx/poolrequests.py+7−5
searx/engines/duckduckgo.py+10−8
@@ -5,7 +5,8 @@
55
66from lxml.html import fromstring
77from json import loads
8−from searx.utils import extract_text, match_language, eval_xpath
8+from searx.utils import extract_text, match_language, eval_xpath, dict_subset
9+from searx.poolrequests import get
910
1011# about
1112about = {
@@ -35,6 +36,7 @@ language_aliases = {
3536
3637# search-url
3738url = 'https://html.duckduckgo.com/html'
39+url_ping = 'https://duckduckgo.com/t/sl_h'
3840time_range_dict = {'day': 'd',
3941 'week': 'w',
4042 'month': 'm'}
@@ -65,27 +67,27 @@ def request(query, params):
6567
6668 params['url'] = url
6769 params['method'] = 'POST'
68− params['data']['b'] = ''
6970 params['data']['q'] = query
70− params['data']['df'] = ''
71+ params['data']['b'] = ''
7172
7273 region_code = get_region_code(params['language'], supported_languages)
7374 if region_code:
7475 params['data']['kl'] = region_code
7576 params['cookies']['kl'] = region_code
76− if params['time_range'] in time_range_dict:
77− params['data']['df'] = time_range_dict[params['time_range']]
7877
78+ params['data']['df'] = time_range_dict.get(params['time_range'], '')
7979 return params
8080
8181
8282# get response from search-request
8383def response(resp):
84− results = []
84+ # ping
85+ headers_ping = dict_subset(resp.request.headers, ['User-Agent', 'Accept-Encoding', 'Accept', 'Cookie'])
86+ get(url_ping, headers=headers_ping)
8587
88+ # parse the response
89+ results = []
8690 doc = fromstring(resp.text)
87−
88− # parse results
8991 for i, r in enumerate(eval_xpath(doc, result_xpath)):
9092 if i >= 30:
9193 break
searx/poolrequests.py+7−5
@@ -1,7 +1,7 @@
11import sys
22from time import time
33from itertools import cycle
4−from threading import RLock, local
4+from threading import local
55
66import requests
77
@@ -88,10 +88,12 @@ class SessionSinglePool(requests.Session):
8888 super().__init__()
8989
9090 # reuse the same adapters
91− with RLock():
92− self.adapters.clear()
93− self.mount('https://', next(https_adapters))
94− self.mount('http://', next(http_adapters))
91+ self.adapters.clear()
92+
93+ https_adapter = threadLocal.__dict__.setdefault('https_adapter', next(https_adapters))
94+ http_adapter = threadLocal.__dict__.setdefault('http_adapter', next(http_adapters))
95+ self.mount('https://', https_adapter)
96+ self.mount('http://', http_adapter)
9597
9698 def close(self):
9799 """Call super, but clear adapters since there are managed globaly"""