request.get()でWebテキストをDLする

投稿者: | 2022-04-13

目次

ダウンロードする

  • このWebページのリクエストが成功したかどうかは、Responseオブジェクトのstatus_code属性を調べればわかる
  • request.code.ok = HTTPプロトコルの「200」(Not Foundは400)
import requests
res = requests.get('https://miwadaice.info/scraping')
res.status_code == requests.codes.ok
# True

print(res.text)
# The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare
#
# This eBook is for the use of anyone anywhere at no cost and with
# almost no restrictions whatsoever.  You may copy it, give i

エラーをチェックする

  • raise_for_status()は、ダウンロードが失敗したときに必ずプログラムを終了させるよい方法
res = requests.get('http://inventwithpython.com/page_that_does_not_exist')
res.raise_for_status()
  • ダウンロード失敗が、プログラムを停止させるほどのものでなければtry~except文で囲んで、この場合は「異常終了させず」にエラーを処理することも可能
  • requests.get()を呼び出したら必ずraise_for_status()を呼び出すようにしたほうがよい
    プログラムの実行を継続する前に、実際にダウンロードされたことを確認したほうがよいため
import requests
res = requests.get('http://inventwithpython.com/page_that_does_not_exist')
try:
    res.raise_for_status()
except Exception as exc:
    print('問題あり:{}'.format(exc))

#問題あり:404 Client Error: Not Found for url: http://inventwithpython.com/page_that_does_not_exist

ダウンロードしたファイルを保存する

  • openの引数は「'wb'
  • ファイルを「バイナリ書き込み」モードで開く
  • プレーンテキストであってもUNICODEの文字コードを維持するためにバイナリモードで保存する必要がある
  • チャンクで分割して書き込むことでメモリを消費しない
import requests
res = requests.get('http://automatetheboringstuff.com/files/rj.txt')
res.raise_for_status()
play_file = open('RomeoAndJuliet.txt', 'wb')
for chunk in res.iter_content(100000): # 100KB
    play_file.write(chunk)
play_file.close()
RomeoAndJuliet.txt

カテゴリー: 未分類