電波ビーチ

☆(ゝω・)v

soundcloud.com/you/setsの指定要素からurlを抜き取ってくる

あらすじ

消される前に落としたいのだけれどsoundcloudAPIからは自分のアカウントでlikeしたtrackにはアクセスできるのですが、playlistには対応してないらしいです。

stackoverflow.com

ならばpython+bs4+seleniumで、とも思ったのですが、pythonすら危ういのに使ったことない技術を2つも使うのは無理勉強しているうちに消されちゃうとなったので別の方法を模索しました。ちなみに結論からいうと一切pythonとか使わずに済んだのですが丸2日以上を要しました。アホです

とりあえず現状あるぶんだけのurlがわかればいいのでタイトルです。

Chromeデベロッパーツールを使う

適当に「webページ スクレイピング」とかで検索するとこちらの記事がヒットしました。ありがとうございます。

qiita.com

CSSセレクタがなんなのかは知らんけど、ElementsからurlがあるタグでCopy -> Copy Selectorでとってきたフルパスを流用したらいけたのでもうこれでいいです

> $$('div.playableTile__description > div.playableTile__descriptionContainer > a').map(e=>e.origin+e.pathname).join('\n');
> copy($_)

これでクリップボードにコピーされるので煮るなり焼くなりですね。

アウトテイクス

わたしなりに煮るなり焼くなりしました。

必要になりそうな知識

ざっくり、目的として、取得したurl先のsetsをscdlで指定のフォルダにDLするという感じ。 ぼんやりとやる羽目になりそうな手順を調べてやる羽目になりそうなやつとぶちあたりそうなやつを考えてみる。

  • ターゲットとなるurlを改行区切りにした.txtをラズパイに送る
    • そもそも可能かすら知らない
    • 不可能だったりめんどくさそうすぎるなら平文メールなり自分垢にDMなりやる
  • (ラズパイ側で)くだんのtxtを読み込む
  • (ラズパイ側で)scdl実行
    • scdlはコマンドである
      • python(いつの間にか前提)で外部コマンドを使う方法なんて知らん(そもそも可能かどうかも知らん)
      • python内で使えたとして、それを監視できるか、例えばダメだったときにログを残せるか知らん

知らんこと多すぎるけど進める。

touchコマンドでファイルに書き出す

果たしてコマンドから一発でファイルに書き出すやりかた知らんかったけどググったら出てきた。エディタすら立ち上げるのがめんどくさい

touch urls1.txt
vi urls1.txt

viの使い方も知らんのでいちいちググった

ファイルをmacからラズパイに送る

scpコマンドとかいうのでできるらしい

Error 403 (Forbidden)|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

user$ scp -p /the/directory/for/urls1.txt pi@192.xxx.xxx.xxx:/home/pi/scdl/urls1.txt
pi@192.xxx.xxx.xxx's password: 
urls1.txt                                     100% 5095     5.0KB/s   00:00 

pythonを使おうとする(使えなかったです)

さてここからpython内で「テキストファイルからurlを読み込みそれぞれに外部コマンドから処理を走らせる」旨のことをしたい。ざっと調べたところ外部コマンドはsubprocessなるモジュールを使うといいらしい。プロセスとか出てきたがよくわからん。 コピペしてこのような感じでやってみたのだが、

with open('urltext.txt', 'r') as f:
    for line in f:
        p = subprocess.Popen(["scdl", "-l", line, "-c"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdo, _ = p.communicate()
        print("process: ", stdo)

動くには動くぽいのだが、コマンドが実行されている雰囲気がない。そもそもプロセスの定義とか挙動とかわからんしPopenとかいうのに渡している引数も最初のコマンドしか知らない。あとこのコマンドを使うと本来ならばプログレスバーが表示されるのだがpythonの標準出力でそんなことが可能なのか知らん。わからん。10時間くらい溶かしたところで諦める。

forコマンドを使う(できた)

自棄酒を煽っていたところ、forの存在を知る。

for line in `cat ../urltext.text`; do scdl -l ${line} -c;  done

これであっさりと動き出した。10時間返せ。結局pythonで得たのはファイルを扱うときはwith openでやるとcloseする必要がないよ、という教科書で得たやつを実装する経験だけで、何もないのと同じだった。。。。みんな一体どこでコマンドとかの知識を得ているというのだ。。