LoginSignup
4
4

More than 3 years have passed since last update.

初心者がプロキシ環境下でPythonを使ってAPIを叩く

Last updated at Posted at 2019-05-20

pythonとやらでAPIを叩きたい

めでたくpythonデビューしたpythonを触って2日目の超初心者が、
プロキシ環境化でえんやこらとAPIを叩こうとするメモ。

まずは基本の環境構築

私のpythonデビュー1日目の環境を流用しています。
https://qiita.com/akimoto__ri/items/5d4711c279d111622117
APIだけ叩きたいならpostgres以外があれば大丈夫。たぶん。

必要なモジュール

requests
https://requests-docs-ja.readthedocs.io/en/latest/
普通にpipと叩いてinstallしようとすると、無事にこけます。
いろいろ試してみたけれど、プロキシで引っかかっていました。

プロキシ環境化でインストールしたい場合は以下のようにを実行する必要がありました。
pip3 install requests --proxy ***
これで無事にrequestsモジュールを入れることができました。

今回使うAPI

Darksky
https://darksky.net/dev

お天気APIのDarkSkyを今回使用することにします。
無料登録をするとすぐにAPIが発行され、緯度経度を持たせて投げることでその地点の天気情報が手に入ります。
「TRY FOR FREE」から簡単に登録が可能です。
メールアドレスとパスワードを登録すると、SecurityキーとSample APIが発行されます。
今回はこの時発行されたAPIURLをそのまま使ってみることにしました。
登録直後画面、「Sample API Call」にサンプルが発行されています。

試しにAPIURLをPostmanで投げてみた。
image.png
取れました。初期URLの緯度経度はなぜかアルカトラズに指定されています。

pythonで実装

今回はAPIを投げて取るだけの簡単実装です。
シンプルにソースを書きました。

PythonTest.py
import requests
import json

# HTTPS API
url = 'https://api.darksky.net/forecast/****************/37.8267,-122.4233'
headers = {'units': 'si' , 'lang': 'ja' , 'exclude': 'alerts,flags'}

request = requests.session()
res = request.get(url , headers=headers)
lists = json.loads(res.text)
print(lists)

これをコマンドプロンプトから実行してみる。

console
C:\pythonDirectry python PythonTest.py
Traceback (most recent call last):
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\contrib\pyopenssl.py", line 453, in wrap_socket
    cnx.do_handshake()
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1915, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1639, in _raise_ssl_error
    raise SysCallError(errno, errorcode.get(errno))
OpenSSL.SSL.SysCallError: (10054, 'WSAECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 839, in _validate_conn
    conn.connect()
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connection.py", line 344, in connect
    ssl_context=context)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\util\ssl_.py", line 344, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\contrib\pyopenssl.py", line 459, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: SysCallError(10054, 'WSAECONNRESET')",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

・・・・・・

もちゃくそに怒られてしまった。
SSLかあと思いつつ色々調べ、いろいろと試してみたが一向に解消しなかった。

プロキシの再来

結果から言うと、原因はプロキシでした。
https://2.python-requests.org//en/master/user/advanced/#proxies
公式ドキュメントの通りにプロキシを引数として与える。

PythonTest.rb
import requests
import json

# HTTPS API
url = 'https://api.darksky.net/forecast/****************/37.8267,-122.4233'
headers = {'units': 'si' , 'lang': 'ja' , 'exclude': 'alerts,flags'}

proxies = {
  'http': 'http://******:8080',
  'https': 'http://******:8080',
}
request = requests.session()
res = request.get(url , headers=headers , proxies=proxies)
lists = json.loads(res.text)
print(lists)

コンソールから実行してみよう。

console
C:\pythonDirectry python PythonTest.py
{"latitude":37.8267,"longitude":-122.4233,"timezone":"America/Los_Angeles","currently":{"time":1558333976,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","nearestStormDistance":1,"nearestStormBearing":241,"precipIntensity":0,"precipProbability":0,"temperature":52.58,"apparentTemperature":52.58,"dewPoint":47.93,"humidity":0.84,"pressure":1012.05,"windSpeed":5.43,"windGust":5.43,"windBearing":273,"cloudCover":0.81,"uvIndex":0,"visibility":9.51,"ozone":437.9},"minutely":{"summary":"Mostly cloudy for the hour.","icon":"partly-cloudy-night","data":・・・・・・・・・・・

無事にできました。。。
よしよし。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4