WebAPI使う基本 「ひとがご」のGoogleサジェスト結果を取得する

URLエンコード

URLエスケープともいう。

from urllib import urlencode
param = {
  'hl':'ja',
  'q': 'ひとがご',
  'output':'toolbar',
}
encoded_param = urlencode(param)

outputを止めて、'callback':'callback_func'にすると、callback_funcが指定されたJSONPでレスポンスを取得することができる。

URLの作成

GoogleSuggestのURL

url = 'http://www.google.co.jp/complete/search?%s' % param

HTTPアクセス

リクエストの送信及びレスポンスの取得。

import urllib2
try:
  res = urllib2.urlopen(url);
except urllib2.HTTPError,e:
  print e.read()
  exit(0)

[追記]ステータスコードが403等の場合、ifでステータスコードを検出する前にエラーが発生して終了していたので改修

(おまけ)レスポンスボディのファイルへのかきこみ

response_body = res.read();
f = open('/tmp/response.xml','w')
f.write(response_body)
f.close()

(おまけ)レスポンスボディの整形(tidyを使う)

tidyコマンドを使って整形を行う。

from popen2 import popen2
response_body = res.read();
(pipeout,pipein) = popen2('tidy -xml -utf8 -i')
pipein.write(response_body)
pipein.close()
for line in pipeout:
  print line, 
pipeout.close()

ってやったら、popen2は古いから、subprocessを使えと言われた。

from subprocess import *
p = Popen(['/usr/bin/tidy','-xml','-utf8','-i'],shell=False,bufsize=1,stdin=PIPE,stdout=None,close_fds=True)
p.stdin.write(response_body)
p.stdin.close()

bufsize=1は1行ずつバッファリング。0はしないでそれ以外の正の整数ならその大きさのバッファが使われるのだそうな。
http://www.python.jp/doc/2.5/lib/node530.html


以上を踏まえて、グーグルサジェストを使って「ひとがご」のサジェストをさせた時に出力されるものを取得するスクリプト

# -*- coding: utf-8 -*-
from urllib import urlencode
from urllib2 import urlopen
from subprocess import *

param = {
  'hl':'ja',
  'q': 'ひとがご',
  'output':'toolbar',
}
encoded_param = urlencode(param)

url = 'http://www.google.co.jp/complete/search?%s' % (encoded_param)
print url
try:
  res = urlopen(url);
except HTTPError,e
  print e.read()
  exit(0)

response_body = res.read()
p = Popen(['/usr/bin/tidy','-xml','-utf8','-i'],shell=False,bufsize=1,stdin=PIPE,stdout=None,close_fds=True)
p.stdin.write(response_body)
p.stdin.close()


結果は以下のとおり。

<?xml version="1.0"?>
<toplevel>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ" />
    <num_queries int="11000000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ aa" />
    <num_queries int="296000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミ" />
    <num_queries int="16800000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ ムスカ" />
    <num_queries int="38900" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ 名言" />
    <num_queries int="153000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのよう" />
    <num_queries int="17100000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ youtube" />
    <num_queries int="2110000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="人がゴミのようだ 英語" />
    <num_queries int="640000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="まるで人がゴミのようだ" />
    <num_queries int="626000" />
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="なんで、人がゴミのようなん" />
    <num_queries int="16000000" />
  </CompleteSuggestion>
</toplevel>

[参考]http://blog.livedoor.jp/dqnplus/archives/1345757.html
Google日本語入力すごいね。