使用Google API获取前10条搜索结果

1 投票
2 回答
5646 浏览
提问于 2025-04-16 08:31

我想获取谷歌搜索的前10个结果。

比如说:

... 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']

这个代码可以让我得到第一页的搜索结果,但我想要更多的谷歌搜索结果,有人知道怎么做吗?

2 个回答

0

查看文档 http://code.google.com/apis/websearch/docs/reference.html#_intro_fonje

你需要关注的是“start”这个参数。

没有办法一次性获取更多的结果,但你可以通过“start”这个参数来逐步获取。

3

我以前做过这个,这里有个完整的例子(我不是Python高手,但这个是可以用的):

#!/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()

补充:我修正了一些明显的命令行选项处理问题;你可以这样调用这个脚本:

python gsearch.py --min=5 vanessa mae

--min这个选项的意思是“至少要5个结果”,它是可选的,如果你不指定这个选项,你将得到最多允许的结果数量(64)。

另外,为了简洁起见,错误处理部分没有包含。

撰写回答