1

Google マップ API をテストする Python プロジェクトを作成しました。最初の API: Nearby Search Requests をテストしたときに問題が発生しました。

提供されているこの 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()

残念ながら、私が得たコンソールの結果はこのようなものです:</p>

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
},

この結果は不完全で、何度も試しましたが、結果は同じです。では、この問題を解決するにはどうすればよいでしょうか。

4

4 に答える 4

1

問題は、HTTP にソケットを使用していることです。具体的にsock.read()は、相手側が送信したすべてのバイトを読み取ることが保証されていません。代わりに、空のバイト文字列が返されるまで、質問し続ける必要があります。その後、すべてを受け取ったことを確認できます。しかし、ソケットは非常に扱いにくいものであり、ソケットを使用することはほとんどお勧めできません。また、より高いレベルのフレームワークを使用することをお勧めします。たとえば、evenssl_sock.write()は実際にはすべてを書き込むことさえできず (または少なくともsock.send()確実にこのように動作し)、代わりに送信されたバイト数を返します。それが渡したデータより少ない場合は、残りの (未送信) データ。

さて、HTTP では、ソケットを使用している人を見たことがありません。代わりurllib2.urlopen(...)urllib2やさらに優れたPython Requestsのようなものを使用してください。さらに、urllibhttplibがあります。たとえば、Python Requestsを使用すると、コードは次のように単純になります。

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応答全体が含まれていることが保証されています。部分的な応答が得られることはありません。

PSリクエストにいくつかの HTTP リクエスト ヘッダーを渡す必要がある場合は、それも行うことができます。

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

raw ソケットについて詳しく知りたい場合はPPS (できれば HTTP 以外の目的でのみ)、 The Python Socket Programming HOWTOを参照してください。

于 2013-10-02T10:22:39.500 に答える
0

データは複数の送受信で送信されます。したがって、ループを実行して、データがいつ来るかを確認する必要があります

receivedString = ""
While True:
    data = socket.recv(1024) #max length 1024
    #time.sleep(0.25)
    if(len(data) < 1):
       break
    recievedString = recievedString + data
于 2016-01-17T12:00:10.153 に答える
0

help(sock.read)与えます:

モジュール ssl で読み込まれるメソッドのヘルプ:

ssl.SSLSocket インスタンスの read(self, len=1024) メソッド LEN バイトまで読み込み、返す。EOF で長さ 0 の文字列を返します。

あなたの応答は1024文字に近いので、試してください:

data = '  '
while len(data) > 0:
    data = sock.read()
    print data,
print "\nDone."
于 2013-10-02T10:32:58.253 に答える