概要

私が書いている「投資ブログ」でInstagramの投稿記事を紹介することがあります。ただ1つ困ったことがあって、Instagramのページでは投稿記事の画像をブラウザの操作からダウンロードできません。

たとえば通常、ブラウザに表示された画像上で右クリックをすると「名前を付けて画像を保存…」という項目が出てきます。

でもInstagramのページでは画像上で右クリックしても「名前を付けて画像を保存…」の項目が出てきません。

画面をスクリーンショットするなどで画像を保存することもできますが、Instagramの画像をダウンロードするPythonスクリプトを作成してみたので紹介したいと思います。

準備

今回のスクリプトではWebスクレイピングに欠かせないBeautifulSoup、Selenium、webdriverを使用するので、インストールしていない場合は以下のコマンドでインストールしておいてください。

プログラム

スクリプトの全体はこちらになります。

スクリプトのダウンロードはこちらからどうぞ。

このスクリプトを実行すると、スクリプトと同じフォルダに10個の画像がダウンロードされます。

プログラムの説明

簡単にプログラムの内容を説明していきます。

まずは必要なライブラリモジュールをインポートします。

次にメインの処理をするクラスInstagramImgDownloaderを定義しています。まずコンストラクタでseleniumのwebdriverを起動しています。ここではブラウザは非表示(headless)で起動させています。img_cntという変数は画像を保存するときに名前に連番をつけるためのものです。

InstagramImgDownloaderクラスのget_image関数は、InstagramのURLを渡すことでメインの画像をダウンロードし、ファイルに保存します。

Instagramのページに表示されるメインの画像ですが、ページのHTMLを表示してみると、画像の<img>タグには<class=”FFVAD”>が指定されているのが分かります。これを利用してBeautifulSoupで画像の部分を取り出しています。

(クリックで拡大)

そしてダウンロードした画像データを、shutilモジュールのcopyfileobj関数を使ってファイルに保存しています(28、29行名)。

そのあとbreakしてforループを抜けている(31行目)のは、ここでストップしないとサムネイル画像までダウンロードしてしまうためです。

スクリプトが実行されたときの処理ですが、まず画像を保存したいインスタグラムのURLをリスト変数「URLs」に代入しています(41~50行目)。

その後、InstagramImgDownloaderクラスのインスタンスを作成し、forループでURLのリストから1つ1つURLを渡しています(51~53行目)。

さいごに

今回はPythonでWebスクレイピングをすることで、Webから直接画像をダウンロードしてみました。今回のプログラムを改変することで、ブラウザの操作では直接ダウンロードできない画像もダウンロードできるようになるかもしれません。誰かの参考になれば幸いです。

※注意1
画像には著作権があります。使用にはご注意ください。

※注意2
今回紹介したプログラムは2021年11月1日現在において動作することを確認していますが、今後InstagramページのHTML構造変化などによって動作しなくなる可能性もあります。その点はご了承ください。