日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2024/7/23 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 谷歌地图api_《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Foundations of Python Network Programing,Third Edition 《python網(wǎng)絡(luò)編程》,本書(shū)中的代碼可在Github上搜索fopnp下載

本書(shū)的第一章中使用到了google地圖的api來(lái)獲取一個(gè)地址的經(jīng)度和緯度,因?yàn)楸娝苤脑驎?huì)出現(xiàn)無(wú)法訪問(wèn),我們需要使用代理訪問(wèn)

因此書(shū)上的代碼需要根據(jù)實(shí)際情況來(lái)修改,我的電腦的代理地址為127.0.0.1:1080,下面放我的代碼吧,可根據(jù)自己電腦的代理設(shè)置進(jìn)行修改。

運(yùn)行環(huán)境:Windows 10,Anaconda3,python3.6.3,Pycharm Edu 2017.3

調(diào)用庫(kù):

#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參數(shù)設(shè)置代理(需要先使用pip安裝pygeocoder),因此必須先實(shí)例化,不能像書(shū)中一樣直接print

應(yīng)用層:

#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參數(shù)設(shè)置代理

使用HTTP協(xié)議:

#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')

這里會(huì)提示

Traceback (most recent call last):

File"E:/Learn Python/Python網(wǎng)絡(luò)編程/search3.py", line 21, in geocode('207 N. Defiance St,Archbold, OH')

File"E:/Learn Python/Python網(wǎng)絡(luò)編程/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

很明顯報(bào)了一個(gè)json.decoder.JSONDecodeError的錯(cuò)誤 說(shuō)明沒(méi)有能夠正確訪問(wèn),json decode失敗

print(rawreply)發(fā)現(xiàn)rawreply返回的是這樣的html文件

b'

\n301 Moved\n

301 Moved

\n

The document has moved\n

here.\r\n

\r\n'

返回了一個(gè)301錯(cuò)誤,說(shuō)明需要重定向這里我們使用的是HTTPS協(xié)議因此不會(huì)像瀏覽器一樣直接重定向,感覺(jué)應(yīng)該是google反爬蟲(chóng)的一種行為

因此我們使用正則表達(dá)式提取字符串(方法來(lái)自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')

即可正確輸出結(jié)果

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

Process finished with exit code 0

這里需要注意的是 我一開(kāi)始以為newweb是一個(gè)str,直接使用了connection.request('GET', newweb)

結(jié)果發(fā)現(xiàn)AttributeError: 'list' object has no attribute 'startswith'的錯(cuò)誤,更改之后即可正常輸出

直接使用Socket與谷歌地圖通信:

設(shè)置代理的方法(轉(zhuǎn)自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')

運(yùn)行輸出:

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

總結(jié)

以上是生活随笔為你收集整理的python 谷歌地图api_《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。