pythonpython-3.xgoogle-apigoogle-search-apigoogle-api-python-client

How to query an advanced search with google customsearch API?


How can I programmatically using the Google Python client library do an advanced search with Google custom search API search engine in order to return a list of first n links based in some terms and parameters of an advanced search I queried?.

I tried to check the documentation(I did not found any example), and this answer. However, the latter did not worked, since currently there is no support for the AJAX API. So far I tried this:

from googleapiclient.discovery import build
import pprint

my_cse_id = "test"

def google_search(search_term, api_key, cse_id, **kwargs):
    service = build("customsearch", "v1",developerKey="<My developer key>")
    res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
    return res['items']

results = google_search('dogs', my_api_key, my_cse_id, num=10)

for result in results:
    pprint.pprint(result)

And this:

import pprint

from googleapiclient.discovery import build


def main():
  service = build("customsearch", "v1",developerKey="<My developer key>")

  res = service.cse().list(q='dogs').execute()
  pprint.pprint(res)

if __name__ == '__main__':
  main()

Thus, any idea of how to do and advanced search with google's search engine API?. This is how my credentials look at google console:

credentials


Solution

  • First you need to define a custom search as described here, then make sure your my_cse_id matches the google API custom search (cs) id, e.g.

    cx='017576662512468239146:omuauf_lfve'
    

    is a search engine which only searches for domains ending with .com.

    Next we need our developerKey.

    from googleapiclient.discovery import build
    service = build("customsearch", "v1", developerKey=dev_key)
    

    Now we can execute our search.

    res = service.cse().list(q=search_term, cx=my_cse_id).execute()
    

    We can add additional search parameters, like language or country by using the arguments described here, e.g.

    res = service.cse().list(q="the best dog food", cx=my_cse_id, cr="countryUK", lr="lang_en").execute()
    

    would serch for "the best dog food" in English and the site needs to be from the UK.


    The following modified code worked for me. api_key was removed since it was never used.

    from googleapiclient.discovery import build
    
    my_cse_id = "012156694711735292392:rl7x1k3j0vy"
    dev_key = "<Your developer key>"
    
    def google_search(search_term, cse_id, **kwargs):
        service = build("customsearch", "v1", developerKey=dev_key)
        res = service.cse().list(q=search_term, cx=cse_id, **kwargs).execute()
        return res['items']
    
    results = google_search('boxer dogs', my_cse_id, num=10, cr="countryCA", lr="lang_en")
    for result in results:
        print(result.get('link'))
    

    Output

    http://www.aboxerworld.com/whiteboxerfaqs.htm
    http://boxerrescueontario.com/?section=available_dogs
    http://www.aboxerworld.com/abouttheboxerbreed.htm
    http://m.huffpost.com/ca/entry/10992754
    http://rawboxers.com/aboutraw.shtml
    http://www.tanoakboxers.com/
    http://www.mondlichtboxers.com/
    http://www.tanoakboxers.com/puppies/
    http://www.landosboxers.com/dogs/puppies/puppies.htm
    http://www.boxerrescuequebec.com/