プログラミング

【golang】保存先のファイルを作成したのちに、そのファイルを指定してダウンロードする

お疲れ様です。ダイコー(@pc16691297 )です。以前ブログに書いたスクレイピングツールは無事完成してほっとしているところです。あの時はログインの際にどうやってクリックさせる場所を指定するかについて悩んでいました。

今回は作業も進み、ようやく完成に近づいた時に起きたちょっとしたトラブルです。

あと少しで完成だ!…でも

途中にいろいろ壁もありましたが、 、少しずつ超えていき 無事URLから画像を複数指定してダウンロードできるという完成間近というところまで来た時でした。

「これダウンロード先指定したいよね」

まぁそうですよね。実はこの時点でgo buildで実行ファイルを作成して、スクレイピングをしてもらっていたんですが、画像はその実行したファイルと同じディレクトリにダウンロードされてしまっていたわけです。

やっぱり一度に取ってきた画像群は同じフォルダに収めたいというわけで最後の壁が立ちはだかりました。

結論:保存画像の名前の前にフォルダ名をいれるだけだった

結論を言えば、今回もめちゃくちゃ簡単でした。これに気づけなかった自分が恥ずかしい。

hoge/huga.jpg

こんだけ。

huga.jpgという画像をhogeというフォルダにダウンロードする場合はこのように書けばいいだけでした。チョー簡単

これが思いつかず、一度func init()でフォルダを作成した後、その場所をカレントディレクトリにして実行させようとしたり、一度画像をダウンロードさせて、そのあと別のプログラムを使ってフォルダ分類させようとか考えてました。まじで当時の自分をぶん殴ってあげたいです。

おまけ:ほかの壁って?

最初に書いたほかの壁ってどんなのがあったのかを備忘録として書いておこうと思います。

セレクター指定問題

またセレクターです。こいつはいつも私の頭を悩ませてくれます。くそ

例えばある画像が置いてあるページにアクセスして、その画像すべてをダウンロードしたいとします。もし一枚だけで考えていいのなら、検証ツールで対象画像セレクターの絶対パスが以下のようになっているとき

#fcM > td:nth-child(2) > aa

このように当然aaにたどり着くようにパスを指定すればいいんですが

#fcM > td:nth-child(1) > aa
#fcM > td:nth-child(2) > aa
#fcM > td:nth-child(3) > aa
#fcM > td:nth-child(4) > aa

このようになっていて、複数のセレクターのaa要素を取得したい場合、ここで共通していない数字の部分を省いて指定してあげます。

#fcM > td:nth-child > aa

つまりはこんな感じですね。こうすることでどうやら数字は無視してこのパスに該当するすべての要素を取得してくれるようになるみたいです。

Chrome driver普通にWindowsでも動いた

実ははじめはWindowsにわざわざubuntuを入れて開発していました。

というのも、macでは普通に使えるhomebrewがWindowsじゃ使えないんですよね。当時はまだその方法でしかChrome driverを使えるようにできる方法を知らなかったんです。なのでLinuxbrewを代わりに使ってました。

ところがどっこい、ひじょーーーーに開発環境を作るのが大変でした。やり方を模索し続けてやっとの思いで完成…って感じですね。

でも動いたんです!Windowsでも!Chrome driverが!

PATHを設定してあげるとOK

てかめっちゃこれも簡単でした。適当なところにChrome driverをダウンロードして、zipを解凍します(解凍って古いらしいですね。最近は展開って言うみたいです)。

その後出てきたChrome driverがあるディレクトリの絶対パスをメモします。

そしてWindowsの左下の検索から「環境変数を編集」を選び、PATHに先ほどメモした絶対パスを登録するだけでつかえるようになります。

これ何をしてるかっていうと、PATHというものに登録するとPCが優先的にその場所を探してくれるようになるんです。

PCも場所がわからない!

仮にcmdで「Chrome driver使うから探しといてね」っていう指示をしたとします。このときPCはどこにChrome driverがあるか探さなきゃいけないわけなんですが、それがめちゃくちゃ大変なわけです。

「Chrome driverってどこ!?フォルダが多すぎて検索かけきれないよぉ…」

と弱音を吐いて探すのを諦めます。多分can't find chromedriverとかのエラーを吐いた気がします。

そうならないように「あらかじめこのフォルダを優先的に探してみてね」という場所を記しておくことで、ちゃんとPCが認識してくれるようにしているわけです。

この作業を挟む意味をちょっと前までは理解していませんでした。いやぁ解決してよかったです。

  • この記事を書いた人

じん

自作PC組み立ての代行をやってます。 チェンソーマンとDr.Stoneが好き。

-プログラミング