如何根据位置字段将用户分类到不同国家?
大多数网页应用都有一个地点字段,用户可以在这里输入他们选择的地点。
那么,如何根据用户输入的地点把他们分类到不同的国家呢?
比如,我使用了 Stack Overflow 的一个数据文件 users.xml
,提取了用户的名字、声誉和地点:
['Jeff Atwood', '12853', 'El Cerrito, CA']
['Jarrod Dixon', '1114', 'Morganton, NC']
['Sneakers OToole', '200', 'Unknown']
['Greg Hurlman', '5327', 'Halfway between the boardwalk and Six Flags, NJ']
['Power-coder', '812', 'Burlington, Ontario, Canada']
['Chris Jester-Young', '16509', 'Durham, NC']
['Teifion', '7024', 'Wales']
['Grant', '3333', 'Georgia']
['TimM', '133', 'Alabama']
['Leon Bambrick', '2450', 'Australia']
['Coincoin', '3801', 'Montreal']
['Tom Grochowicz', '125', 'NJ']
['Rex M', '12822', 'US']
['Dillie-O', '7109', 'Prescott, AZ']
['Pete', '653', 'Reynoldsburg, OH']
['Nick Berardi', '9762', 'Phoenixville, PA']
['Kandis', '39', '']
['Shawn', '4248', 'philadelphia']
['Yaakov Ellis', '3651', 'Israel']
['redwards', '21', 'US']
['Dave Ward', '4831', 'Atlanta']
['Liron Yahdav', '527', 'San Rafael, CA']
['Geoff Dalgas', '648', 'Corvallis, OR']
['Kevin Dente', '1619', 'Oakland, CA']
['Tom', '3316', '']
['denny', '573', 'Winchester, VA']
['Karl Seguin', '4195', 'Ottawa']
['Bob', '4652', 'US']
['saniul', '2352', 'London, UK']
['saint_groceon', '1087', 'Houston, TX']
['Tim Boland', '192', 'Cincinnati Ohio']
['Darren Kopp', '5807', 'Woods Cross, UT']
我用下面的 Python 脚本来实现:
from xml.etree import ElementTree
root = ElementTree.parse('SO Export/so-export-2009-05/users.xml').getroot()
items = ['DisplayName','Reputation','Location']
def loop1():
for count,i in enumerate(root):
det = [i.get(x) for x in items]
print det
if count>30: break
loop1()
那么,最简单的方法是什么呢?有没有现成的查找表可以告诉我,某个地点 X
属于哪个国家 Y
?
这个查找表不需要完全准确。通过在 Google 上查询地点字符串,或者更好的是使用 Wolfram Alpha,可以得到相对准确的答案。
2 个回答
1
为了避免混淆,最好让用户明确填写他们的国家。这是最正确的做法。
如果不行,至少可以根据他们的IP地址来做个大致的判断。
比如说,['Grant', '3333', 'Georgia']
这个“Georgia”是指美国的乔治亚州吗?还是指格鲁吉亚共和国呢?
如果他们的IP地址显示在中亚或东欧,那很可能是指格鲁吉亚共和国。如果是在北美,那大概率是指美国的乔治亚州。
需要注意的是,IP地址和国家之间的对应关系并不是100%准确的,而且这个数据库需要定期更新。依我看,这样做麻烦得很。
2
你可以使用一个叫做地理编码API的工具,比如geopy(这里有一些例子)。
比如说,谷歌的地理编码API会在返回的结果中告诉你国家的名字,具体是在CountryNameCode
这个字段里。
不过,仅仅依靠这个位置字段,可能会有不少错误匹配,但也许这样已经足够用了。
如果你有服务器的日志记录,可以尝试用IP地理编码器查找用户的IP地址(更多信息可以参考维基百科)。