こんにちは、はるです。
ファイル拡張子のないファイルをスクレイピングでダウンロードするにはどうやるの?
こんな悩みを解決していきます。
Pythonクローリング&スクレイピングという参考書に載っていた厚生労働省の有効求人倍率データを、スクレイピングでダウンロードしてみようと思いました。
しかし、ファイル拡張子のないファイルで404エラーになり、ダウンロードできず。
2時間ぐらい調べていたら解決したので、まとめていきます。
動作環境
ファイル拡張子のないファイルをスクレイピングでダウンロードするには
2つのやり方があります。
- urllib.request.urlopenを使う(推奨)
- urllib.request.urlretrieveを使う
1つずつ解説していきます。
urllib.request.urlopenを使う(推奨)
手順は以下のとおりです。
- urllib.requestのインポート
- urlをもってくる
- 名前を付けて保存
urllib.requestのインポート
urllib.requestを読み込みます。
import urllib.request
urlをもってくる
ダウンロードURLをもってきます。
url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032059507&fileKind=0'
名前を付けて保存
with open wでファイルに書き込みをします。
urllib.request.urlopen()の値はバイナリ値なので、「w」の後ろに「b」を追加してください。
「b」を入れないと、保存はできますが、うまくエクセルに表示されません。
私自身「b」を追加することを知らず、2時間ほど時間を失いました笑
# urlの処理
dl = urllib.request.urlopen(url).read()
# ファイルへの保存
save_name = "第3表.xlsx"
with open(save_name, "wb") as f:
f.write(dl)
ソースコード
# urlopen
import urllib.request
url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032059507&fileKind=0'
# urlの処理
dl = urllib.request.urlopen(url).read()
# ファイルへの保存
save_name = "第3表.xlsx"
with open(save_name, "wb") as f:
f.write(dl)
urllib.request.urlretrieveを使う
urlopenよりもカンタンにできます。
さいご、urllib.request.urlretrieveにurlとsave_nameを渡せば、できてしまいます。
# urlretrieve
import urllib.request
url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032059507&fileKind=0'
# ファイルへの保存
save_name = "第3表.xlsx"
urllib.request.urlretrieve(url, save_name)
しかし推奨しない理由
公式ドキュメントには、廃止されるかもしれないと書かれているから。
レガシーインターフェース
以下の関数およびクラスは、Python 2 のモジュール urllib (urllib2 ではありません) から移植されたものです。これらは将来的に廃止されるかもしれません。
参考:python公式ドキュメント – レガシーインターフェース
補足
urlの一部を変数化することで、同じようなURLを持ってくるときに変数の中身だけ変えればいいので、楽になるかもしれません。
statInfId = '000032059507'
fileKind = '0'
url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000032059507&fileKind=0'
以上です。
ご覧いただきありがとうございました!
参考記事
コメント