Shreyas094 commited on
Commit
436f2c6
·
verified ·
1 Parent(s): e4ad246

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -16
app.py CHANGED
@@ -3,17 +3,32 @@ import requests
3
  import json
4
  import random
5
  import logging
 
 
6
 
7
  # Configure logging
8
- logging.basicConfig(level=logging.INFO)
 
 
 
 
 
 
 
9
 
10
  # List of SearXNG instances to try
11
  SEARXNG_INSTANCES = [
12
- "https://searx.work",
 
 
 
 
13
  # Add more instances here
 
 
14
  ]
15
 
16
- def search_news(query, num_results=10):
17
  # Shuffle the list of instances to distribute load
18
  random.shuffle(SEARXNG_INSTANCES)
19
 
@@ -32,20 +47,44 @@ def search_news(query, num_results=10):
32
  "count": num_results
33
  # Omitted 'time_range'
34
  }
35
- try:
36
- response = requests.get(f"{searxng_url}/search", params=params, headers=headers, timeout=10)
37
- response.raise_for_status()
38
- results = response.json()
39
- news_items = results.get("news", [])
40
- if news_items:
41
- logging.info(f"Success from instance: {searxng_url}")
42
- return news_items, None
43
- except requests.RequestException as e:
44
- logging.warning(f"Instance {searxng_url} failed: {e}")
45
- continue # Try the next instance
46
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  return [], "Unable to fetch results from any SearXNG instance. Please try again later."
48
 
 
 
 
 
49
  def format_news_markdown(news_items, error=None):
50
  if error:
51
  return f"**Error:** {error}"
@@ -66,7 +105,7 @@ def format_news_markdown(news_items, error=None):
66
  return formatted_results
67
 
68
  def gradio_search_news(query, num_results):
69
- news_items, error = search_news(query, int(num_results))
70
  return format_news_markdown(news_items, error)
71
 
72
  iface = gr.Interface(
 
3
  import json
4
  import random
5
  import logging
6
+ import time
7
+ from functools import lru_cache
8
 
9
  # Configure logging
10
+ logging.basicConfig(
11
+ level=logging.INFO,
12
+ format='%(asctime)s [%(levelname)s] %(message)s',
13
+ handlers=[
14
+ logging.FileHandler("searxng_search.log"),
15
+ logging.StreamHandler()
16
+ ]
17
+ )
18
 
19
  # List of SearXNG instances to try
20
  SEARXNG_INSTANCES = [
21
+ "https://search.inetol.net",
22
+ "https://northboot.xyz",
23
+ "https://search.hbubli.cc",
24
+ "https://searx.tiekoetter.com",
25
+ "https://search.bus-hit.me",
26
  # Add more instances here
27
+ "https://another-instance.com",
28
+ "https://yet-another-instance.com",
29
  ]
30
 
31
+ def search_news(query, num_results=10, max_retries=3):
32
  # Shuffle the list of instances to distribute load
33
  random.shuffle(SEARXNG_INSTANCES)
34
 
 
47
  "count": num_results
48
  # Omitted 'time_range'
49
  }
50
+
51
+ retry_count = 0
52
+ backoff_time = 1 # Start with 1 second
53
+
54
+ while retry_count <= max_retries:
55
+ try:
56
+ response = requests.get(
57
+ f"{searxng_url}/search",
58
+ params=params,
59
+ headers=headers,
60
+ timeout=10
61
+ )
62
+ if response.status_code == 429:
63
+ # If rate limited, wait and retry
64
+ logging.warning(f"Rate limited by {searxng_url}. Retrying in {backoff_time} seconds...")
65
+ time.sleep(backoff_time)
66
+ retry_count += 1
67
+ backoff_time *= 2 # Exponential backoff
68
+ continue
69
+ response.raise_for_status()
70
+ results = response.json()
71
+ news_items = results.get("news", [])
72
+ if news_items:
73
+ logging.info(f"Success from instance: {searxng_url}")
74
+ return news_items, None
75
+ else:
76
+ logging.info(f"No results from {searxng_url}")
77
+ break # Move to the next instance
78
+ except requests.RequestException as e:
79
+ logging.warning(f"Instance {searxng_url} failed: {e}")
80
+ break # Move to the next instance if a non-rate limit error occurs
81
+
82
  return [], "Unable to fetch results from any SearXNG instance. Please try again later."
83
 
84
+ @lru_cache(maxsize=128)
85
+ def cached_search_news(query, num_results=10):
86
+ return search_news(query, num_results)
87
+
88
  def format_news_markdown(news_items, error=None):
89
  if error:
90
  return f"**Error:** {error}"
 
105
  return formatted_results
106
 
107
  def gradio_search_news(query, num_results):
108
+ news_items, error = cached_search_news(query, int(num_results))
109
  return format_news_markdown(news_items, error)
110
 
111
  iface = gr.Interface(