LoginSignup
3
5

More than 5 years have passed since last update.

urllib3とcertifiを使って、PDFをダウンロードする

Last updated at Posted at 2018-11-07

背景

大量に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()

これを実行すると、以下の画像がダウンロードされる
python-640x366.jpg

ただし、以下の警告文が出る。

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でそのサイトにアクセスできるように改造する。

3
5
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
3
5