python 谷歌地图api_《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档...

Foundations of Python Network Programing,Third Edition 《python网络编程》,本书中的代码可在Github上搜索fopnp下载

本书的第一章中使用到了google地图的api来获取一个地址的经度和纬度,因为众所周知的原因会出现无法访问,我们需要使用代理访问

因此书上的代码需要根据实际情况来修改,我的电脑的代理地址为127.0.0.1:1080,下面放我的代码吧,可根据自己电脑的代理设置进行修改。

运行环境:Windows 10,Anaconda3,python3.6.3,Pycharm Edu 2017.3

调用库:

#search1.py

from pygeocoder importGeocoderif __name__ == '__main__':

a=Geocoder()

a.proxy= "127.0.0.1:1080"address= '207 N. Definace St,Archbold,OH'

print(a.geocode(address)[0].coordinates)

这里使用的是Geocoder中的proxy参数设置代理(需要先使用pip安装pygeocoder),因此必须先实例化,不能像书中一样直接print

应用层:

#search2.pyimportrequests

proxies= {"http": "http://127.0.0.1:1080", "https": "http://127.0.0.1:1080", }defgeocode(address):

parameters= {'address': address, 'sensor': 'falise'}

base= 'http://maps.googleapis.com/maps/api/geocode/json'response= requests.get(base, params=parameters, proxies=proxies)

answer=response.json()print(answer['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St,Archbold, OH')

这里使用了requests中的proxies参数设置代理

使用HTTP协议:

#search3.py

importhttp.clientimportjsonfrom urllib.parse importquote_plus

base= '/maps/api/geocode/json'

defgeocode(address):

path= '{}?address={}&sensor=false'.format(base, quote_plus(address))

connection= http.client.HTTPSConnection('127.0.0.1', 1080)

connection.set_tunnel('map.google.com')

connection.request('GET', path)

rawreply=connection.getresponse().read()

reply= json.loads(rawreply.decode('utf-8'))print(reply['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St,Archbold, OH')

这里会提示

Traceback (most recent call last):

File"E:/Learn Python/Python网络编程/search3.py", line 21, in geocode('207 N. Defiance St,Archbold, OH')

File"E:/Learn Python/Python网络编程/search3.py", line 16, ingeocode

reply= json.loads(rawreply.decode('utf-8'))

File"D:\Anaconda3\lib\json\__init__.py", line 354, inloadsreturn_default_decoder.decode(s)

File"D:\Anaconda3\lib\json\decoder.py", line 339, indecode

obj, end= self.raw_decode(s, idx=_w(s, 0).end())

File"D:\Anaconda3\lib\json\decoder.py", line 357, inraw_decoderaise JSONDecodeError("Expecting value", s, err.value) fromNone

json.decoder.JSONDecodeError: Expecting value: line1 column 1 (char 0)

Process finished with exit code 1

很明显报了一个json.decoder.JSONDecodeError的错误 说明没有能够正确访问,json decode失败

print(rawreply)发现rawreply返回的是这样的html文件

b'

\n301 Moved\n

301 Moved

\n

The document has moved\n

here.\r\n

\r\n'

返回了一个301错误,说明需要重定向这里我们使用的是HTTPS协议因此不会像浏览器一样直接重定向,感觉应该是google反爬虫的一种行为

因此我们使用正则表达式提取字符串(方法来自https://www.cnblogs.com/rj81/p/5933838.html),更改后代码如下

#search3.py

importhttp.clientimportjsonfrom urllib.parse importquote_plusimportre

base= '/maps/api/geocode/json'

defgeocode(address):

path= '{}?address={}&sensor=false'.format(base, quote_plus(address))

connection= http.client.HTTPSConnection('127.0.0.1', 1080)

connection.set_tunnel('map.google.com')

connection.request('GET', path)

rawreply=connection.getresponse().read().decode()

newweb= re.findall(r"HREF=\"(.+?)\"", string=rawreply)#print(newweb)

connection.request('GET', newweb[0])

rawreply=connection.getresponse().read()#print(path)

#print(rawreply)

reply = json.loads(rawreply.decode('utf-8'))print(reply['results'][0]['geometry']['location'])if __name__ == '__main__':

geocode('207 N. Defiance St, Archbold, OH')

即可正确输出结果

{'lat': 41.5219645, 'lng': -84.3066496}

Process finished with exit code 0

这里需要注意的是 我一开始以为newweb是一个str,直接使用了connection.request('GET', newweb)

结果发现AttributeError: 'list' object has no attribute 'startswith'的错误,更改之后即可正常输出

直接使用Socket与谷歌地图通信:

设置代理的方法(转自http://www.jb51.net/article/50510.htm)

urllib2:

proxy_handler = urllib2.ProxyHandler({'http' : 'http://地址:端口'})

opener=urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)

urllib2.install_opener(opener)

socket:

importsocks, socket

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"地址", 端口)

socket.socket= socks.socksocket

代码如下:

#search4.py#!/usr/bin/env python3

importsocketimportsocksfrom urllib.parse importquote_plus

request_text= """\

GET /maps/api/geocode/json?address={}&sensor=false HTTP/1.1\r\n\

Host: maps.google.com:80\r\n\

User-Agent: search4.py (Foundations of Python Network Programming)\r\n\

Connection: close\r\n\

\r\n\"""

defgeocode(address):

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1", 1080)

socket.socket=socks.socksocket

sock=socket.socket()

sock.connect(('maps.google.com', 80))

request=request_text.format(quote_plus(address))

sock.sendall(request.encode('ascii'))

raw_reply= b''

whileTrue:

more= sock.recv(4096)if notmore:breakraw_reply+=moreprint(raw_reply.decode('utf-8'))if __name__ == '__main__':

geocode('207 N. Defiance St, Archbold, OH')

运行输出:

HTTP/1.1 200OK

Content-Type: application/json; charset=UTF-8Date: Fri,12 Jan 2018 07:21:20GMT

Expires: Sat,13 Jan 2018 07:21:20GMT

Cache-Control: public, max-age=86400Access-Control-Allow-Origin: *Server: mafe

X-XSS-Protection: 1; mode=block

X-Frame-Options: SAMEORIGIN

Accept-Ranges: none

Vary: Accept-Language,Accept-Encoding

Connection: close

{"results": [

{"address_components": [

{"long_name" : "207","short_name" : "207","types" : [ "street_number"]

},

{"long_name" : "North Defiance Street","short_name" : "N Defiance St","types" : [ "route"]

},

{"long_name" : "Archbold","short_name" : "Archbold","types" : [ "locality", "political"]

},

{"long_name" : "German Township","short_name" : "German Township","types" : [ "administrative_area_level_3", "political"]

},

{"long_name" : "Fulton County","short_name" : "Fulton County","types" : [ "administrative_area_level_2", "political"]

},

{"long_name" : "Ohio","short_name" : "OH","types" : [ "administrative_area_level_1", "political"]

},

{"long_name" : "United States","short_name" : "US","types" : [ "country", "political"]

},

{"long_name" : "43502","short_name" : "43502","types" : [ "postal_code"]

},

{"long_name" : "1160","short_name" : "1160","types" : [ "postal_code_suffix"]

}

],"formatted_address" : "207 N Defiance St, Archbold, OH 43502, USA","geometry": {"bounds": {"northeast": {"lat" : 41.521994,"lng" : -84.30646179999999},"southwest": {"lat" : 41.521935,"lng" : -84.30683739999999}

},"location": {"lat" : 41.5219645,"lng" : -84.3066496},"location_type" : "ROOFTOP","viewport": {"northeast": {"lat" : 41.5233134802915,"lng" : -84.30530061970849},"southwest": {"lat" : 41.5206155197085,"lng" : -84.3079985802915}

}

},"place_id" : "ChIJk4BHnIy0PYgRXbKj5GjFe_U","types" : [ "premise"]

}

],"status" : "OK"}

Process finished with exit code0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

耳机不分主从是什么意思_无延时音质好的蓝牙耳机能代替有线耳机吗—DOSS T60上手体验...

伴随着手机的更新迭代,大概是从iPhone 7的时候大家开始对手机是否有3.5mm耳机孔这个问题开始纠结起来,好像是从真无线耳机出来时大家又对3,5mm耳机孔又不是那么的纠结。此一时彼一时,大家为何对耳机接口为何有这么大的转变,就拿今…

switch安装linux教程,Freeswitch Linux安装教程 | 【韩涛博客】

大家都有一个经历,经过漫长的编译后,各种报错,经过整理后,我总结出了以下无错步骤:(一)安装编译所需要的环境包yum install -y autoconf automake libtool gcc-c ncurses-devel make zlib-devel libjpeg-devel(二)安装…

空间金字塔池化_回顾语义分割—DenseASPP (密集空洞空间金字塔池化)

引言在分辨率大,分割目标尺度范围广的语句分割任务中,长距离的上下文信息以及不同尺度的信息对于分割结果十分重要。所以为了增大卷积但感受野,常常对提取的feature map进行池化以达到感受野增大的效果,同时通过跳跃连接来结合多尺…

python软件如何安装方法_【新手必看】Python软件下载及安装教程

原标题:【新手必看】Python软件下载及安装教程 Python下载:免费开源 官网地址:https://www.python.org/downloads/ 下载对应版本Python:python-3.6.1-amd64.exe(我的电脑是window 7-64位),所以我…

如何下载linux历史版本下载,CentOS历史版本下载方法

实验室要求统一Linux版本,原来我用的是Ubuntu,现在我在的实验室是centos,我也就只能改了。实验室和个人不同,个人的Linux版本可能经常换,只要有新的版本出来,我就会去下载下来,在虚拟机里面试一…

table超出边框出现滚动条_精美横轴智能滚动条设计

如何设计一款精美的横轴智能滚动条?本文对设计过程进行了详细地介绍。页面布局页面设定新建一个页面文件,命名为【精美横轴智能滚动条设计】。在【精美横轴智能滚动条设计】页面内新建一个命名为【table】的动态面板。【底层背景】:从元件库内…

如何在python中安装matplotlib模块_Windows下为Python安装Matplotlib模块

这玩意反反复复弄了一晚上,这里详细叙述下如何安装,肯定会对大家有所帮助。首先默认大家都装了Python,这个从官网下基本不会有任何难度。 (1)Setuptools的安装 为啥先说这个,后面所有whl文件都要用这个安装…

linux 状态码的意义,HTTP状态码是什么?常见的状态码描述都有什么?

网络安全学习过程中,网络协议都有哪些相关内容?HTTP状态码是什么?HTTP状态码有什么意义吗?常见的状态码描述都有什么?很多小伙伴不是很清楚,我们来看看。什么是HTTP状态码?当浏览者访问一个网页…

马冬晗学习计划表_一年时间提升学习和工作能力,我做对了这3点

文 / 小椰子 昨晚和朋友去大排档吃宵夜,酒足饭饱之后,发现他两眼无神地盯着桌上的空啤酒瓶:“讲真,毕业后出来工作这一年多,我好几次想重新回去读书。”我诧异地看着他,静静地听他继续说下去。“现在的自己…

python编写递归函数、求斐波那契数列第n项_python使用递归求斐波那契数列中第n个数的值...

原博文 2019-11-29 16:33 − def byh(n): if n 1 or n 2: return 1 return byh(n-1) byh(n-2)print(byh(8)) #1,1,2,3,5,8,13,21,输出结果:21... 相关推荐 2019-12-12 14:08 − 使用range函数生成数值列表 使用range函数打印1~5的数字 for i in range(1,6): prin…

sqlsugar 批量删除guid类型主键_SAP使用MASS批量修改主数据

由于公司业务部门需要,向我提出的这个要求,我就在网上查了下,看到了一位知乎的前辈大神写了,自己测试了下把过程更详细的记录了一下,也挺好用,就在这里记录和分享一下,便于以后查看。业务场景&a…

kali linux 搜狗输入法,kali_Linux下安装搜狗输入法

1. 由于我的虚拟机里kali是32位,如果64位系统就找对应的安装包。依赖软件下载地址:http://http.kali.org/pool/main/f/fcitx/1 ) dpkg -i fcitx-libs_4.2.8.4-3~bpo701_amd64.deb2 ) dpkg -i fcitx-libs_4.2.8.4-3~bpo701_i386.deb3 ) dpkg -i fcitx-l…

python数据库操作sqlite_使用Python对SQLite数据库操作

原博文 2017-04-05 15:25 − SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在IOS和Android的APP中都可以集成。 Python内置了SQLite3&…

python工业自动化镜头_ELVIS III + Python | 如何用Python对ELVIS III进行编程开发

通过本文,你将学习如何在NI ELVIS III上安装和使用Python:连接到NI ELVIS III,安装包和库,下载存储库,运行Python代码。1 - 软件环境搭建配置ELVIS III设备1)安装 NI Measurement Live Support Files;2)通过…

多屏互动协议 linux,【Linux系统多屏互动电视】Linux系统多屏互动电视报价及图片大全-列表版-ZOL中关村在线...

对比所属:TCLE5690系列最大的特点就是搭载了当前彩电领域最高端、最火爆的4K UHD超高清面板。并采用MSTAR四核处理器和最新的Android4.2操作系统,确保了超高清信号从输入、到解码、到显示的全程超高清处理,确保最优化的4K超高清显示。产品定位…

python删除txt指定内容_python删除文件中指定内容

更多追问追答 追问 我按你的方法试了下,文件内容还在,没有删掉...... 追答 把你的 file.txt 贴出来,确保 20150723 在要删除行的最开始,前面不能有空格等其他任何字符。 另外, 原来的代码最后漏了一行lines [l for …

ad16自动布线设置规则_设计 | 18种pcb设计特殊布线的画法与技巧!

蛇形线方法Tool 里选 Interactive length tuning 要先布好线再改成蛇形, 这里用的是布线时直接走蛇形: 先 P->T 布线, 再 Shift A 切换成蛇形走线按 Tab 可设置属性, 类型了选用圆弧,Max Amplitude 设置最大的振幅 ,Gap 就是间隔(不知这么翻译对不) ,下面左边是…

c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介

C语言bcopy()函数:复制内存(字符串)头文件:#include bcopy() 函数用来复制内存(字符串),其原型为:void bcopy(const void *src, void *dest, int n);【参数】src 为源内存块(字符串)指针,dest 为目标内存块(字符串)指针…

c语言密码锁程序,急求C语言电子密码锁程序

你要什么要求的程序呢?我这里有个程序#include#include#includeunsigned char code ps[] {1,2,3,4,5};unsigned char code dispcode[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsigned char pslen9;unsigned char templen;unsigned char digit;unsig…