从谷歌API获取语言检测
我有一个CSV文件,其中一列是关键词,另一列是展示次数。
我想把这些关键词放到一个网址里(循环处理),然后让谷歌的语言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 个回答
试着添加 referrer
和 userip
,具体内容可以参考文档:
有一个特别需要注意的地方,就是在请求中正确地识别自己。应用程序必须在请求中始终包含一个有效且准确的http referer头。此外,我们建议,但不强制每个请求都包含一个有效的API Key。提供这个密钥可以让你的应用程序给我们一个额外的识别方式,这在我们需要联系你解决问题时会很有用。想了解更多关于API密钥的好处,可以查看相关内容。
我们也鼓励开发者使用userip参数(见下文),来提供你代表最终用户发起API请求时的IP地址。这样做可以帮助我们区分合法的服务器端流量和那些不是来自最终用户的流量。
下面是一个基于这个回答的例子,回答的是“用Python访问Google”的问题:
#!/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'))