从Google API获取语言检测

时间:2010-11-30 00:52:28

标签: python api

我的CSV包含一列中的关键字和第二列中的展示次数。

我想在网址中提供关键字(循环播放时),并为Google语言api提供关键字所用的语言类型。

我手动工作。如果我输入(使用正确的api密钥): http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&key=myapikey&q=merde 我明白了: {“responseData”:{“language”:“fr”,“isReliable”:false,“confidence”:6.213709E-4},“responseDetails”:null,“responseStatus”:200} 这是正确的,'merde'是法国人。

到目前为止,我有这段代码,但我一直收到服务器无法访问的错误:

import time
import csv
from operator import itemgetter
import sys
import fileinput
import urllib2
import json

E_OPERATION_ERROR = 1
E_INVALID_PARAMS = 2

#not working
def parse_result(result):
  """Parse a JSONP result string and return a list of terms"""

  # Deserialize JSON to Python objects
  result_object = json.loads(result)

  #Get the rows in the table, then get the second column's value
  # for each row
  return row in result_object

#not working
def retrieve_terms(seedterm):

  print(seedterm) 
  """Retrieves and parses data and returns a list of terms"""
  url_template = 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&key=myapikey&q=%(seed)s'
  url = url_template % {"seed": seedterm}


  try:
    with urllib2.urlopen(url) as data:
      data = perform_request(seedterm)
      result = data.read()
  except:
    sys.stderr.write('%s\n' % 'Could not request data from server')
    exit(E_OPERATION_ERROR)

  #terms = parse_result(result)
  #print terms
  print result

def main(argv):
  filename = argv[1]

  csvfile = open(filename, 'r')
  csvreader = csv.DictReader(csvfile)

  rows = []
  for row in csvreader:
    rows.append(row)

  sortedrows = sorted(rows, key=itemgetter('impressions'), reverse = True)

  keys = sortedrows[0].keys()

  for item in sortedrows:
    retrieve_terms(item['keywords'])

  try:
    outputfile = open('Output_%s.csv' % (filename),'w')
  except IOError:
    print("The file is active in another program - close it first!")
    sys.exit()  
  dict_writer = csv.DictWriter(outputfile, keys, lineterminator='\n')
  dict_writer.writer.writerow(keys)
  dict_writer.writerows(sortedrows)
  outputfile.close()

  print("File is Done!! Check your folder") 

if __name__ == '__main__':
  start_time = time.clock()
  main(sys.argv)
  print("\n")
  print time.clock() - start_time, "seconds for script time"

知道如何完成代码以便它能够正常工作吗?谢谢!

1 个答案:

答案 0 :(得分:1)

尝试按照the docs中的说明添加referreruserip

  

需要特别注意的领域   涉及正确识别   你自己的要求。   应用程序必须总是包含一个   有效且准确的 http referer 标头   在他们的要求。另外,我们   问,但不要求,每个   请求包含有效的 API密钥。通过   提供密钥,您的应用程序   为我们提供了一个辅助   识别机制   有用的我们需要联系你   为了纠正任何问题。读   更多关于拥有一个的有用性   API密钥

     

开发人员也鼓励制作   使用 userip 参数(请参阅   在下面)提供的IP地址   代表您的最终用户   发出API请求。这样做会   帮助区分这种合法性   来自流量的服务器端流量   不是来自最终用户。

以下是基于问题the answer"access to google with python"的示例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import urllib, urllib2
from pprint import pprint

api_key, userip = None, None
query = {'q' : 'матрёшка'}
referrer = "https://stackoverflow.com/q/4309599/4279"

if userip:
    query.update(userip=userip)
if api_key:
    query.update(key=api_key)

url = 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&%s' %(
    urllib.urlencode(query))

request = urllib2.Request(url, headers=dict(Referer=referrer))
json_data = json.load(urllib2.urlopen(request))

pprint(json_data['responseData'])

输出

{u'confidence': 0.070496580000000003, u'isReliable': False, u'language': u'ru'}

另一个问题可能是seedterm没有正确引用:

if isinstance(seedterm, unicode):
   value = seedterm
else: # bytes
   value = seedterm.decode(put_encoding_here)
url = 'http://...q=%s' % urllib.quote_plus(value.encode('utf-8'))