##背景
大量にPDFをダウンロードする必要が出て、マクロを組んだが、windows10に移行したことにより(?)うまく動かなくなった。会社のプロキシなどの影響でこの通りに動かないかもしれないが、家の環境でPDFをダウンロードできることを確認する。
##urllib3のみで画像をダウンロード
import urllib3
download_url = 'https://s3-ap-northeast-1.amazonaws.com/samurai-blog-media/blog/wp-content/uploads/2017/08/python-640x366.jpg'
request_methods = urllib3.PoolManager()
response = request_methods.request('GET', download_url)
f = open('result.jpg', 'wb')
f.write(response.data)
f.close()
ただし、以下の警告文が出る。
C:\Users\ユーザー名\Anaconda3\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
証明書の内容の確認(certificate verification)を追加することを強く要望されている。リンク上でコードを確認して、次はPDFをダウンロードした。PDFは適当。
##PDFをダウンロード
#追加
import certifi
import urllib3
#https://~~でも問題ない
download_url = 'http://www.nistep.go.jp/wp/wp-content/uploads/NISTEP-STT134J-2.pdf'
#変更点
request_methods = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
response = request_methods.request('GET', download_url)
f = open('result.pdf', 'wb')
f.write(response.data)
f.close()
これで動くようになる。これでも動かない場合は、
pip install urllib3[secure]
urllib3[secure]をpipでinstallする必要がある。私はこれでPDFをダウンロードできた。
PDFはダウンロードできるのは確認できたが、私が欲しいデータはIDとパスワードを入力しないと入れないサイトなので、それをpythonで突破しないといけない。次はそれを試していこうと思う。そうすれば、どんなサイトのPDFもダウンロードできるはずだ。
##追記
やはり会社のプロキシが邪魔をしたため、会社の環境だと上記のコードでは落とすことができなかった。
そこで、urllib3でプロキシ認証を通す。
python urllib3 を使った通信で認証プロキシを通すが非常に参考になった。
import certifi
import urllib3
#コロンで区切って、ユーザIDとパスワードを記入。ID:password
PROXY_BASIC_AUTH = "id:password"
#プロキシのURLとport
PROXY_URL = "http://proxy:port"
#https://~~でも問題ない
download_url = 'http://www.nistep.go.jp/wp/wp-content/uploads/NISTEP-STT134J-2.pdf'
headers = urllib3.util.make_headers(proxy_basic_auth=PROXY_BASIC_AUTH)
http = urllib3.ProxyManager(proxy_url=PROXY_URL,
proxy_headers=headers,
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
#ダウンロードの準備
response = http.request('GET', download_url)
#ファイル名を決める。
f = open('result3.pdf', 'wb')
#ファイルの保存
f.write(response.data)
f.close()
目的のユーザIDとパスワードが必要なサイトのPDFをこれでダウンロードしようとしたが、やはりだめだった。pythonでそのサイトにアクセスできるように改造する。