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
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/
An alternative using the python requests library if you do not want to use the google discovery api:
import requests, pprint
q='italy'
api_key='AIzaSyCs.....................'
q = requests.get('https://content.googleapis.com/customsearch/v1',
params={ 'cx': '013027958806940070381:dazyknr8pvm', 'q': q, 'key': api_key} )
pprint.pprint(q.json())
This is late but hopefully it helps someone...
For advanced search use
response=service.cse().list(q="mysearchterm",
cx="017576662512468239146:omuauf_lfve", ).execute()
The list()
method takes in more args to help advance your search... check args here:
https://developers.google.com/custom-search/json-api/v1/reference/cse/list