gpt4 book ai didi

python - 为什么我无法使用 Google Map api 获取完整数据?

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:42 25 4
gpt4 key购买 nike

我创建了一个 Python 项目来测试 google map api。我在测试第一个 API 时遇到了问题:附近的搜索请求。

我试过官方文档提供的这个url: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&types=food&name=harbour&sensor=false&key=AddYourOwnKeyHere 如果我把这个 url 放在我的浏览器上,我将在浏览器上获得完美的数据。然后我什么也没做,只是创建了一个 python 模块,这是代码:

if __name__ == '__main__':  

import socket
import ssl


sock = ssl.wrap_socket(socket.socket())
sock.connect(('maps.googleapis.com', 443))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('maps.googleapis.com', 443))
sslSocket = socket.ssl(s)
uri = 'GET /maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&sensor=false&key=MyKey HTTP/1.1\r\nHost:maps.googleapis.com\r\nContent-Type: application/json; charset=UTF-8\r\naccept-encoding:gzip,deflate,sdch\r\n\r\n'
sslSocket.write(uri)

data = sock.read()
print 'going to connect...'
print data
s.close()

不幸的是,我得到的控制台结果是这样的:

going to connect...
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Wed, 02 Oct 2013 08:05:59 GMT
Expires: Wed, 02 Oct 2013 08:10:59 GMT
Cache-Control: public, max-age=300
Vary: Accept-Language
Server: mafe
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 443:quic
Transfer-Encoding: chunked

560b
{
"debug_info" : [],
"html_attributions" : [
"Listings by \u003ca href=\"http://www.yellowpages.com.au/\"\u003eYellow Pages\u003c/a\u003e"],
"next_page_token" : "ClRHAAAA4lOaMlZcUjyndIqhBsHzyyU0nD5PHarmjgmnguj3morn7Em- ipqhSR33V__d0kjrL4PzAqY7y4TAK7Uj3XzWjhoUchLBcBs- TNFxWIvGst8SEArmj_T7_eDZWyr8UDGy5OEaFPFaK2yHDg7Kv2U3Obsy7opkQfEw",
"results" : [
{
"geometry" : {
"location" : {
"lat" : -33.8599827,
"lng" : 151.2021282
},
"viewport" : {
"northeast" : {
"lat" : -33.8552584,
"lng" : 151.2031401
},

这个结果不完整,我试了很多次,结果都是一样的。那么,如何解决这个问题呢?

最佳答案

问题是您正在为 HTTP 使用套接字。具体来说,sock.read()不保证读取对方发送的所有字节;相反,您必须不断询问它,直到它返回一个空字节字符串。然后你就可以确定你已经收到了所有东西。但是,套接字真的很棘手,使用它们几乎从来都不是一个好主意,而更喜欢更高级别的框架几乎总是一个好主意。例如,即使 ssl_sock.write()实际上甚至可能不会写所有内容(或者至少 sock.send() 肯定是这样的)而是返回发送的字节数,如果这少于您传递给它的数据,您必须重试其余的(未发送的) ) 数据。

现在,有了 HTTP,我以前从未见过有人使用套接字。而是使用像 urllib2.urlopen(...) 这样的东西在 urllib2甚至更好 Python Requests 。此外,还有 urllibhttplib .例如,使用 Python 请求,您的代码变得非常简单:

import requests

response = requests.get('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&sensor=false&key=MyKey')
data = response.json() # shortcut to `import json; json.loads(response.text)`

安装 Python Requests 的最简单方法是使用 pip install requests (或 easy_install requests )。或者,如果您更愿意避免依赖:

import json
import urllib

data_raw = urllib.urlopen('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&sensor=false&key=MyKey').read()
data = json.loads(data_raw)

现在,data保证包含完整的响应;你永远不会得到部分回应。

附言如果您需要在请求中传递一些 HTTP 请求 header ,您也可以这样做:

requests.get(url, headers={...})

P.P.S. 如果您想了解有关原始套接字的更多信息(希望仅用于非 HTTP 目的),请参阅 Python Socket Programming HOWTO

关于python - 为什么我无法使用 Google Map api 获取完整数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19134675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com