dhisana 0.0.1.dev215__py3-none-any.whl → 0.0.1.dev216__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dhisana/utils/serperdev_search.py +54 -15
- {dhisana-0.0.1.dev215.dist-info → dhisana-0.0.1.dev216.dist-info}/METADATA +1 -1
- {dhisana-0.0.1.dev215.dist-info → dhisana-0.0.1.dev216.dist-info}/RECORD +6 -6
- {dhisana-0.0.1.dev215.dist-info → dhisana-0.0.1.dev216.dist-info}/WHEEL +0 -0
- {dhisana-0.0.1.dev215.dist-info → dhisana-0.0.1.dev216.dist-info}/entry_points.txt +0 -0
- {dhisana-0.0.1.dev215.dist-info → dhisana-0.0.1.dev216.dist-info}/top_level.txt +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import json
|
|
2
3
|
import os
|
|
3
4
|
from typing import Any, Dict, List, Optional
|
|
@@ -129,7 +130,8 @@ async def search_google_serper(
|
|
|
129
130
|
all_results: List[Dict[str, Any]] = []
|
|
130
131
|
|
|
131
132
|
# We'll collect results from "organic", converting each to a SerpAPI-like format.
|
|
132
|
-
|
|
133
|
+
timeout = aiohttp.ClientTimeout(total=30, connect=10)
|
|
134
|
+
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
133
135
|
while len(all_results) < number_of_results:
|
|
134
136
|
payload = {
|
|
135
137
|
"q": full_query,
|
|
@@ -142,20 +144,57 @@ async def search_google_serper(
|
|
|
142
144
|
}
|
|
143
145
|
|
|
144
146
|
logger.debug(f"Requesting Serper.dev page {page} for query '{full_query}'.")
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
147
|
+
for attempt in range(3):
|
|
148
|
+
try:
|
|
149
|
+
async with session.post(url, headers=headers, json=payload) as response:
|
|
150
|
+
if response.status != 200:
|
|
151
|
+
try:
|
|
152
|
+
error_content = await response.json()
|
|
153
|
+
except Exception:
|
|
154
|
+
error_content = await response.text()
|
|
155
|
+
logger.warning(
|
|
156
|
+
"Non-200 response from Serper.dev: %s (status=%s)",
|
|
157
|
+
error_content,
|
|
158
|
+
response.status,
|
|
159
|
+
)
|
|
160
|
+
return [json.dumps({"error": error_content})]
|
|
161
|
+
|
|
162
|
+
result_json = await response.json()
|
|
163
|
+
break
|
|
164
|
+
except asyncio.TimeoutError:
|
|
165
|
+
logger.warning(
|
|
166
|
+
"Timeout contacting Serper.dev (attempt %s/3) for query '%s'",
|
|
167
|
+
attempt + 1,
|
|
168
|
+
full_query,
|
|
169
|
+
)
|
|
170
|
+
except aiohttp.ClientError as exc:
|
|
171
|
+
logger.warning(
|
|
172
|
+
"Client error contacting Serper.dev (attempt %s/3): %s",
|
|
173
|
+
attempt + 1,
|
|
174
|
+
exc,
|
|
175
|
+
)
|
|
176
|
+
if attempt == 2:
|
|
177
|
+
logger.exception("Exception during Serper.dev request.")
|
|
178
|
+
return [json.dumps({"error": str(exc)})]
|
|
179
|
+
except Exception as e:
|
|
180
|
+
logger.exception("Unexpected exception during Serper.dev request.")
|
|
181
|
+
return [json.dumps({"error": str(e)})]
|
|
182
|
+
else:
|
|
183
|
+
# Successful request, exit retry loop
|
|
184
|
+
break
|
|
185
|
+
await asyncio.sleep(2 ** attempt)
|
|
186
|
+
else:
|
|
187
|
+
logger.error(
|
|
188
|
+
"Failed to retrieve data from Serper.dev after multiple attempts for query '%s'",
|
|
189
|
+
full_query,
|
|
190
|
+
)
|
|
191
|
+
return [
|
|
192
|
+
json.dumps(
|
|
193
|
+
{
|
|
194
|
+
"error": "Serper.dev request timed out after multiple attempts.",
|
|
195
|
+
}
|
|
196
|
+
)
|
|
197
|
+
]
|
|
159
198
|
|
|
160
199
|
organic_results = result_json.get("organic", [])
|
|
161
200
|
if not organic_results:
|
|
@@ -76,7 +76,7 @@ dhisana/utils/serpapi_local_business_search.py,sha256=vinmuXLaQ_0BpEdwnONZ2vLTq5
|
|
|
76
76
|
dhisana/utils/serpapi_search_tools.py,sha256=MglMPN9wHkGAHb7YAQXvEDsWK3RGS-zu3wUIvZAYxfo,31738
|
|
77
77
|
dhisana/utils/serperdev_google_jobs.py,sha256=m5_2f_5y79FOFZz1A_go6m0hIUfbbAoZ0YTjUMO2BSI,4508
|
|
78
78
|
dhisana/utils/serperdev_local_business.py,sha256=JoZfTg58Hojv61cyuwA2lcnPdLT1lawnWaBNrUYWnuQ,6447
|
|
79
|
-
dhisana/utils/serperdev_search.py,sha256=
|
|
79
|
+
dhisana/utils/serperdev_search.py,sha256=_iBKIfHMq4gFv5StYz58eArriygoi1zW6VnLlux8vto,9363
|
|
80
80
|
dhisana/utils/smtp_email_tools.py,sha256=kx0VSa0JQyVLD020oARCHhOBZJxDwMIri1Z7jPN0nP4,15843
|
|
81
81
|
dhisana/utils/test_connect.py,sha256=-BL0BfHsKuD9JMAfKzyWyLolcZomYlKQWYdkQC8TOn8,53970
|
|
82
82
|
dhisana/utils/trasform_json.py,sha256=s48DoyzVVCI4dTvSUwF5X-exX6VH6nPWrjbUENkYuNE,6979
|
|
@@ -92,8 +92,8 @@ dhisana/workflow/agent.py,sha256=esv7_i_XuMkV2j1nz_UlsHov_m6X5WZZiZm_tG4OBHU,565
|
|
|
92
92
|
dhisana/workflow/flow.py,sha256=xWE3qQbM7j2B3FH8XnY3zOL_QXX4LbTW4ArndnEYJE0,1638
|
|
93
93
|
dhisana/workflow/task.py,sha256=HlWz9mtrwLYByoSnePOemBUBrMEcj7KbgNjEE1oF5wo,1830
|
|
94
94
|
dhisana/workflow/test.py,sha256=kwW8jWqSBNcRmoyaxlTuZCMOpGJpTbJQgHI7gSjwdzM,3399
|
|
95
|
-
dhisana-0.0.1.
|
|
96
|
-
dhisana-0.0.1.
|
|
97
|
-
dhisana-0.0.1.
|
|
98
|
-
dhisana-0.0.1.
|
|
99
|
-
dhisana-0.0.1.
|
|
95
|
+
dhisana-0.0.1.dev216.dist-info/METADATA,sha256=9AsIIMKtc-BrvNBrKu0lBLRSkcWPjBBcJxpOXa3twkc,1190
|
|
96
|
+
dhisana-0.0.1.dev216.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
97
|
+
dhisana-0.0.1.dev216.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
|
|
98
|
+
dhisana-0.0.1.dev216.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
|
|
99
|
+
dhisana-0.0.1.dev216.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|