@@ -387,52 +387,94 @@ def web_search(
387387
388388def google_search_sync (query : str , api_key : str , search_engine_id : str , max_results : int = 5 ) -> Dict [str , Dict [str , Any ]]:
389389 """
390- Perform a search using Google Custom Search API synchronously.
390+ Perform a search using Google Custom Search API synchronously with pagination support .
391391
392392 Args:
393393 query: The search query
394394 api_key: Google API key
395395 search_engine_id: Google Search Engine ID
396+ max_results: Maximum number of results to return (will paginate if > 10)
396397
397398 Returns:
398399 Dictionary mapping URLs to search result data
399400 """
400401 try :
401- logger .info (f"Performing Google Custom Search for: { query } " )
402-
403- url = "https://www.googleapis.com/customsearch/v1"
404- params : Dict [str , str ] = {
405- 'key' : api_key ,
406- 'cx' : search_engine_id ,
407- 'q' : query ,
408- 'num' : str (max_results ) # Number of results as string
409- }
402+ logger .info (f"Performing Google Custom Search for: { query } (max_results: { max_results } )" )
403+
404+ all_results = {}
405+ results_collected = 0
406+ start_index = 1 # Google API uses 1-based indexing
407+
408+ # Calculate how many API calls we need (max 10 results per call)
409+ while results_collected < max_results :
410+ # Calculate how many results to request in this call
411+ results_needed = max_results - results_collected
412+ results_per_call = min (10 , results_needed ) # API limit is 10 per call
413+
414+ logger .info (f"Making API call - start: { start_index } , num: { results_per_call } " )
415+
416+ url = "https://www.googleapis.com/customsearch/v1"
417+ params : Dict [str , str ] = {
418+ 'key' : api_key ,
419+ 'cx' : search_engine_id ,
420+ 'q' : query ,
421+ 'num' : str (results_per_call ),
422+ 'start' : str (start_index )
423+ }
410424
411- response = requests .get (url , params = params )
425+ response = requests .get (url , params = params )
426+ logger .info (f"API Response Status: { response .status_code } " )
412427
413- if response .status_code != 200 :
414- logger .error (f"Google Search API error: { response .status_code } " )
415- logger .error (f"Response: { response .text } " )
416- return {}
428+ if response .status_code == 200 :
429+ data = response .json ()
430+ items = data .get ('items' , [])
431+
432+ if not items :
433+ logger .info (f"No more results available. Collected { results_collected } results total." )
434+ break
417435
418- data = response .json ()
436+ logger .info (f"Retrieved { len (items )} results in this call" )
437+
438+ # Process results from this call
439+ for item in items :
440+ link = item .get ('link' , '' )
441+ title = item .get ('title' , '' )
442+ snippet = item .get ('snippet' , '' )
443+
444+ if link :
445+ all_results [link ] = {
446+ 'title' : title ,
447+ 'snippet' : snippet ,
448+ 'url' : link
449+ }
450+ results_collected += 1
451+
452+ # Stop if we've collected enough results
453+ if results_collected >= max_results :
454+ break
455+
456+ # Prepare for next API call
457+ start_index += len (items )
458+
459+ # Check if we've reached the end of available results
460+ total_results = data .get ('searchInformation' , {}).get ('totalResults' , '0' )
461+ if start_index > int (total_results ):
462+ logger .info (f"Reached end of available results. Total available: { total_results } " )
463+ break
419464
420- # Process search results
421- results = {}
422- if 'items' in data :
423- for item in data ['items' ]:
424- url = item .get ('link' )
425- if url :
426- results [url ] = {
427- 'title' : item .get ('title' , '' ),
428- 'snippet' : item .get ('snippet' , '' )
429- }
465+ else :
466+ logger .error (f"Google Search API error: { response .status_code } " )
467+ logger .error (f"Response: { response .text } " )
468+ break
430469
431- logger .info (f"Found { len (results ) } search results " )
432- return results
470+ logger .info (f"Google Search completed. Total results collected: { len (all_results ) } " )
471+ return all_results
433472
473+ except requests .exceptions .RequestException as e :
474+ logger .error (f"Request error during Google search: { e } " )
475+ return {}
434476 except Exception as e :
435- logger .error (f"Error in Google search: { str ( e ) } " )
477+ logger .error (f"Unexpected error during Google search: { e } " )
436478 return {}
437479
438480
0 commit comments