お問い合わせ

tel:0570-046-503

営業時間 10:00~17:00(定休日:土日祝日)

楽天商品説明内にある楽天キャビネットの画像を抽出する

   2015/08/04

楽天の商品画像や商品説明画像は楽天キャビネット内にアップロードして保存していますが、

特定の商品内で使っている画像を一括でダウンロードしておきたいといった要望も

あるのではないかと思います。

残念ながら、RMSの楽天キャビネットの画像登録・編集では、一括ダウンロードはできません。


そこで、一括で画像をダウンロードするツールを作ってみようと思います。


用意するのは、RMSからダウンロードした、商品一括登録用のCSVです。

現在アップロードされている商品のCSVを取得するには、

RMSメニューの

商品ページ設定メニュー→CSV更新(変更・削除)→詳細タイプを選択して

CSVダウンロードボタンを押すと、FTPサーバ上の/ritem/downloadフォルダに

dl-itemタイムスタンプ.csv形式でダウンロードされます。


ダウンロードしたファイルは必要ないレコード(商品)は削除するなどしてください。

それではソースのご紹介です。

C#で作成しています。

処理の流れとしては

dl-item.csv取込→画像URLの解析→ダウンロード

です。


using (var fdl = new OpenFileDialog())
            {
                fdl.Filter = "CSVファイル(*.csv)|*.csv";

                if (fdl.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                {
                    return;
                }

                var name = fdl.FileName;

                var dt = ImportCSV(name);

                downloadLoalImage(dt);
            }

            //取り込みが完了しました
            MessageBox.Show("楽天キャビネットからの画像ダウンロードが完了しました。");

まずは、ファイルダイアログを開きます。先ほどダウンロードしたCSVファイルを読み込むように指定します。


次は、ImportCSVメソッドで、CSVファイルを取り込みます。

        /// <summary>
        /// ファイル取込
        /// </summary>
        /// <param name="filename">ファイルパス</param>
        private DataTable ImportCSV(string filename)
        {
            using (var parser = new TextFieldParser(filename, Encoding.GetEncoding("shift_jis")))
            {
                var dt = new DataTable();

                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");
                parser.HasFieldsEnclosedInQuotes = true;

                string[] data = null;

                var isInitialize = true;

                //一行ごとに読み込む
                while (!parser.EndOfData)
                {
                    data = parser.ReadFields();

                    //カラムの数を取得します。
                    int cols = data.Length;

                    if (isInitialize)
                    {
                        for (int i = 0; i < cols; i++)
                        {
                            //カラム名にダミーを設定します。
                            dt.Columns.Add(data[i]);
                        }
                        isInitialize = false;
                        continue;
                    }

                    //DataTableに追加するための新規行を取得します。
                    DataRow row = dt.NewRow();
                    for (int i = 0; i < cols; i++)
                    {
                        //カラムの数だけデータを移します。
                        row[i] = data[i];
                    }
                    //DataTableに追加します。
                    dt.Rows.Add(row);

                }
                return dt;
            }
        }

カラム数に関係なく、全カラム、全レコードデータをDataTableに読み込んでいます。

次がいよいよ本番。downloadLoalImageメソッドで読み込んだDataTableからイメージを抽出していきます。

private void downloadLoalImage(DataTable dt)
        {
            using (var web = new WebClient())
            {
                foreach (DataRow row in dt.Rows)
                {
                    //まず商品画像URLを取得

                    var imgURL = row["商品画像URL"].ToString();

                    if (imgURL == null || imgURL == "") continue;

                    var urls = imgURL.Split(' ');
                    foreach (var url in urls)
                    {
                        var localpath = url.Replace("http://image.rakuten.co.jp/ストア名/cabinet/",@"ダウンロードするローカルパス");

                        var dir = System.IO.Path.GetDirectoryName(localpath);

                        if (!System.IO.Directory.Exists(dir))
                        {
                            System.IO.Directory.CreateDirectory(dir);
                        }
                        try
                        {
                            web.DownloadFile(url, localpath);
                        }
                        catch (Exception e)
                        {
                            continue;
                        }   
                    }

                    //商品説明内から正規表現で全てマッチするものを抽出
                    var regs = "http://image.rakuten.co.jp/ストア名/cabinet/.*.jpg";

                    var r = new Regex(regs, RegexOptions.IgnoreCase);

                    //正規表現で抽出
                    var matches = r.Matches(row["PC用販売説明文"].ToString());

                    //無ければ空
                    if (matches == null || matches.Count == 0) continue;

                    foreach(var m in matches)
                    {
                        var url = m.ToString();
                        var localpath = url.Replace("http://image.rakuten.co.jp/ストア名/cabinet/", @"ダウンロードするローカルパス");

                        var dir = System.IO.Path.GetDirectoryName(localpath);

                        if (!System.IO.Directory.Exists(dir))
                        {
                            System.IO.Directory.CreateDirectory(dir);
                        }
                        try
                        {
                            web.DownloadFile(url, localpath);
                        }
                        catch(Exception e)
                        {
                            continue;
                        }
                    }

                }
            }

        }


商品画像列と商品説明列から画像URLのパスを抽出します。

まずは、商品画像列です。

半角空白区切りで、複数の画像パスが登録できるので、抽出できた件数分WebClientクラスの

DownloadFileメソッドを使ってローカルファイルにダウンロードします。


商品説明列も同様です。

まずは、正規表現で自ストアのキャビネット画像を含む画像パスを抽出します。

あとは、キャビネットフォルダごと、ローカルにダウンロードします。


そこそこ時間はかかりますが、これで一括ダウンロードは完了です。


次回は今回とは逆で、RMSの機能を使って画像の一括削除についてご紹介できればと思います。

  • ブログランキング・にほんブログ村へ
  • FC2ブログランキングへ
  • 人気ブログランキングへ
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)