ファイル拡張子のないファイルをスクレイピングでダウンロードする方法【python】

Python プログラミング

こんにちは、はるです。

はてな顔

困った人 ファイル拡張子のないファイルをスクレイピングでダウンロードするにはどうやるの?

こんな悩みを解決していきます。 

Pythonクローリング&スクレイピングという参考書に載っていた厚生労働省の有効求人倍率データを、スクレイピングでダウンロードしてみようと思いました。

しかし、ファイル拡張子のないファイルで404エラーになり、ダウンロードできず。

2時間ぐらい調べていたら解決したので、まとめていきます。

動作環境

googlecolaboratory

記事の内容

ファイル拡張子のないファイルをスクレイピングでダウンロードするには

2つのやり方があります。

  • urllib.request.urlopenを使う(推奨)
  • urllib.request.urlretrieveを使う

1つずつ解説していきます。

urllib.request.urlopenを使う(推奨)

手順は以下のとおりです。

  1. urllib.requestのインポート
  2. urlをもってくる
  3. 名前を付けて保存

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.urlretrieveurlsave_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'

  

以上です。
ご覧いただきありがとうございました。

参考記事