user422100
user422100

Reputation: 2179

get the first 10 google results using googleapi

I need to get the first 10 google results

for example:

... query = urllib.urlencode({'q' : 'example'})
... 
... url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
... % (query)
... search_results = urllib.urlopen(url)
... json = simplejson.loads(search_results.read())
... results = json['responseData']['results']

this will give me the results of the first page, but I`d like to get more google results, do anyone know how to do that?

Upvotes: 1

Views: 5868

Answers (2)

barti_ddu
barti_ddu

Reputation: 10299

I've done it in the past, here is complete example (i'm not python guru, but it works):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, getopt
import urllib
import simplejson

OPTIONS = ("m:", ["min="])

def print_usage():
    s = "usage: " + sys.argv[0] + " "
    for o in OPTIONS[0]:
        if o != ":" : s += "[-" + o + "] "
    print(s + "query_string\n")

def search(query, index, offset, min_count, quiet=False, rs=[]):
    url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&%s&start=%s" % (query, offset)
    result = urllib.urlopen(url)
    json = simplejson.loads(result.read())
    status = json["responseStatus"]
    if status == 200:
        results = json["responseData"]["results"]
        cursor = json["responseData"]["cursor"]
        pages = cursor["pages"]
        for r in results:
            i = results.index(r) + (index -1) * len(results) + 1
            u = r["unescapedUrl"]
            rs.append(u)
            if not quiet:
                print("%3d. %s" % (i, u))
        next_index  = None
        next_offset = None
        for p in pages:
            if p["label"] == index:
                i = pages.index(p)
                if i < len(pages) - 1:
                    next_index  = pages[i+1]["label"]
                    next_offset = pages[i+1]["start"]
                break
        if next_index != None and next_offset != None:
            if int(next_offset) < min_count:
                search(query, next_index, next_offset, min_count, quiet, rs)
    return rs

def main():
    min_count = 64
    try:
        opts, args = getopt.getopt(sys.argv[1:], *OPTIONS)
        for opt, arg in opts:
            if opt in ("-m", "--min"):
                min_count = int(arg)
        assert len(args) > 0
    except:
        print_usage()
        sys.exit(1)
    qs = " ".join(args)
    query = urllib.urlencode({"q" : qs})
    search(query, 1, "0", min_count)

if __name__ == "__main__":
    main()

Edit: i've fixed obvious command-line options mishandling; you can call this script as follows:

python gsearch.py --min=5 vanessa mae

--min switch means "at least 5 results" and is optional, you will get maximum allowed result count (64) if it is not specified.

Also, error handling is omitted for brevity.

Upvotes: 3

Kissaki
Kissaki

Reputation: 9217

See docs http://code.google.com/apis/websearch/docs/reference.html#_intro_fonje

You’re looking for the start parameter.

There’s no parameter to get more results in one response, but you can iterate via the start parameter.

Upvotes: 0

Related Questions