86 """Assemble a Bing-Web request."""
88 engine_region = traits.get_region(params[
'searxng_locale'], traits.all_locale)
89 engine_language = traits.get_language(params[
'searxng_locale'],
'en')
92 page = params.get(
'pageno', 1)
108 query_params[
'FORM'] =
'PERE'
110 query_params[
'FORM'] =
'PERE%s' % (page - 2)
112 params[
'url'] = f
'{base_url}?{urlencode(query_params)}'
114 if params.get(
'time_range'):
115 unix_day = int(time.time() / 86400)
116 time_ranges = {
'day':
'1',
'week':
'2',
'month':
'3',
'year': f
'5_{unix_day-365}_{unix_day}'}
117 params[
'url'] += f
'&filters=ex1:"ez{time_ranges[params["time_range"]]}"'
128 dom = html.fromstring(resp.text)
132 for result
in eval_xpath_list(dom,
'//ol[@id="b_results"]/li[contains(@class, "b_algo")]'):
134 link = eval_xpath_getindex(result,
'.//h2/a', 0,
None)
137 url = link.attrib.get(
'href')
138 title = extract_text(link)
140 content = eval_xpath(result,
'.//p')
144 for e
in p.xpath(
'.//span[@class="algoSlug_icon"]'):
145 e.getparent().remove(e)
146 content = extract_text(content)
149 if url.startswith(
'https://www.bing.com/ck/a?'):
151 url_query = urlparse(url).query
152 parsed_url_query = parse_qs(url_query)
153 param_u = parsed_url_query[
"u"][0]
155 encoded_url = param_u[2:]
157 encoded_url = encoded_url +
'=' * (-len(encoded_url) % 4)
159 url = base64.urlsafe_b64decode(encoded_url).decode()
162 results.append({
'url': url,
'title': title,
'content': content})
166 result_len_container =
"".join(eval_xpath(dom,
'//span[@class="sb_count"]//text()'))
167 if "-" in result_len_container:
168 start_str, result_len_container = re.split(
r'-\d+', result_len_container)
169 start = int(start_str)
173 result_len_container = re.sub(
'[^0-9]',
'', result_len_container)
174 if len(result_len_container) > 0:
175 result_len = int(result_len_container)
177 expected_start =
_page_offset(resp.search_params.get(
"pageno", 1))
179 if expected_start != start:
180 if expected_start > result_len:
190 msg = f
"Expected results to start at {expected_start}, but got results starting at {start}"
193 results.append({
'number_of_results': result_len})
198 """Fetch languages and regions from Bing-Web."""
205 "User-Agent": gen_useragent(),
206 "Accept":
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
207 "Accept-Language":
"en-US;q=0.5,en;q=0.3",
208 "Accept-Encoding":
"gzip, deflate, br",
210 "Connection":
"keep-alive",
211 "Upgrade-Insecure-Requests":
"1",
213 "Cache-Control":
"max-age=0",
216 resp = get(
"https://www.bing.com/account/general", headers=headers)
218 print(
"ERROR: response from bing is not OK.")
220 dom = html.fromstring(resp.text)
224 engine_traits.languages[
'zh'] =
'zh-hans'
226 map_lang = {
'prs':
'fa-AF',
'en':
'en-us'}
233 for href
in eval_xpath(dom,
'//div[@id="language-section-content"]//div[@class="languageItem"]/a/@href'):
234 eng_lang = parse_qs(urlparse(href).query)[
'setlang'][0]
235 babel_lang = map_lang.get(eng_lang, eng_lang)
237 sxng_tag = language_tag(babel.Locale.parse(babel_lang.replace(
'-',
'_')))
238 except babel.UnknownLocaleError:
239 print(
"ERROR: language (%s) is unknown by babel" % (babel_lang))
245 bing_ui_lang = eng_lang.lower()
246 if '-' not in bing_ui_lang:
247 bing_ui_lang = bing_ui_lang +
'-' + bing_ui_lang_map.get(bing_ui_lang, bing_ui_lang)
249 conflict = engine_traits.languages.get(sxng_tag)
251 if conflict != bing_ui_lang:
252 print(f
"CONFLICT: babel {sxng_tag} --> {conflict}, {bing_ui_lang}")
254 engine_traits.languages[sxng_tag] = bing_ui_lang
258 engine_traits.regions[
'zh-CN'] =
'zh-cn'
263 for href
in eval_xpath(dom,
'//div[@id="region-section-content"]//div[@class="regionItem"]/a/@href'):
264 cc_tag = parse_qs(urlparse(href).query)[
'cc'][0]
265 if cc_tag ==
'clear':
266 engine_traits.all_locale = cc_tag
270 for lang_tag
in babel.languages.get_official_languages(cc_tag, de_facto=
True):
271 if lang_tag
not in engine_traits.languages.keys():
274 lang_tag = lang_tag.split(
'_')[0]
275 market_code = f
"{lang_tag}-{cc_tag}"
277 market_code = map_market_codes.get(market_code, market_code)
278 sxng_tag = region_tag(babel.Locale.parse(
'%s_%s' % (lang_tag, cc_tag.upper())))
279 conflict = engine_traits.regions.get(sxng_tag)
281 if conflict != market_code:
282 print(
"CONFLICT: babel %s --> %s, %s" % (sxng_tag, conflict, market_code))
284 engine_traits.regions[sxng_tag] = market_code