python запросов и urllib ошибок https - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу прочитать данные из nasa earth api , при открытии URL в браузере отображаются данные. Когда я пытаюсь сделать запрос GET с python и urllib, он выдает ошибку.

request.urlopen("https://api.nasa.gov/planetary/earth/imagery?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY").read()

urllib.error.HTTPError: Ошибка HTTP 400: Неверный запрос

Когда я пытаюсь сделать это с запросами. Возвращает ошибку.

r = requests.get("https://api.nasa.gov/planetary/earth/imagery?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY")

r.content is:

{"error": {"code": "HTTPS_REQUIRED", "message ":" Запросы должны быть сделаны через HTTPS. Попробуйте получить доступ к API по адресу: https://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY "}}

Если я распечатываю r.url, то это http, а не https :

http://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY

Не знаю, почему это происходит, я использую python 3.7. Любая помощь приветствуется

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Мне удалось воспроизвести вашу ошибку. Однако, когда я скопировал ссылку с веб-сайта Nasa, это сработало:

r = requests.get("https://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY")
r.json()
0 голосов
/ 25 февраля 2020

Вы уверены, что ваш URL правильный? Когда я запускаю это в запросе с ведением журнала отладки, я вижу, что первый запрос получает HTTP 301, перенаправленный

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.nasa.gov:443
send: b'GET /planetary/earth/imagery?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY HTTP/1.1\r\nHost: api.nasa.gov\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n'
reply: 'HTTP/1.1 301 MOVED PERMANENTLY\r\n'
header: Server: openresty
header: Date: Tue, 25 Feb 2020 10:56:09 GMT
header: Content-Type: text/html; charset=utf-8
header: Content-Length: 399
header: Connection: keep-alive
header: X-RateLimit-Limit: 40
header: X-RateLimit-Remaining: 36
header: Location: http://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY

URL-адрес, возвращаемый здесь, является http, который затем приводит к запросу к тому, который возвращает неверный запрос HTTP 400

send: b'GET /planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY HTTP/1.1\r\nHost: api.nasa.gov\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n'
DEBUG:urllib3.connectionpool:http://api.nasa.gov:80 "GET /planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY HTTP/1.1" 400 None
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: Server: openresty
header: Date: Tue, 25 Feb 2020 10:56:09 GMT

Если смотреть на ваш URL-адрес по сравнению с тем, который он говорит вам использовать, они отличаются.

Ваш URL-адрес: https://api.nasa.gov/planetary/earth/imagery?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY

Их URL: https://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY

Похоже, вам не хватает / после слова «образ». Когда я использую URL, они предлагают вернуть данные как

b'{\n  "date": "2014-02-04T03:30:01", \n  "id": "LC8_L1T_TOA/LC81270592014035LGN00", \n  "resource": {\n    "dataset": "LC8_L1T_TOA", \n    "planet": "earth"\n  }, \n  "service_version": "v1", \n  "url": "https://earthengine.googleapis.com/api/thumb?thumbid=1e37797ab6e6638b5a0d02392acb479f&token=dc7d50c412dd5dcd7b014d52f0a1f91c"\n}'
...