LoginSignup
2
2

More than 1 year has passed since last update.

clusterで撮った写真を一括DLする

Last updated at Posted at 2019-04-30

本日clusterで行われた「さよなら平成カウントダウンライブ UNiON WAVE - clear -」に参加して、いっぱい写真を撮ったのですが、それらをDLする際に、いちいちボタンを押すのがめんどくさかったのでスクレイピングして一括DLするプログラムを作りました。

注意

  1. 現時点(2019/5/1)で公式に一括DLするシステムが無いためスクレイピングしています。公式に出てきたらそちらを使いましょう。
  2. clusterのアカウントをtwitterでログインしている方のみ使えます。そうでない方はプログラムを書き換える必要があります。
  3. プログラムを書き換える際はサーバーに配慮したリクエストになるようにしましょう。

環境

  • Python 3.6

使い方

ソースコードを持ってきます

git clone https://github.com/meihei3/PicDL_cluster.git
cd PicDL_cluster

twitterでのログイン情報を入れたkeys.pyを作る

echo -e "username='your username'\npassword='your password'" > keys.py

画像を保存するディレクトリimg/を作る

mkdir img

必要な環境のインストール

pip install -r requirements.txt

ダウンローダーの実行

python downloader.py

実行したらこんな感じ↓にchromeで開かれてスクロールすると思います。
スクリーンショット 2019-05-01 4.57.16.png

プログラムの説明

やってること

  1. selenium driverの設定
  2. clusterにログイン
  3. ページをスクロールしながら読み込んでDL用のリストの作成
  4. ダウンロード

1. selenium driverの設定

ChromeDriverを使うための設定をします。(chromeを使う理由はなんとなくです)

from selenium import webdriver
import chromedriver_binary

chromedriver_binary.add_chromedriver_to_path()
driver = webdriver.Chrome()

参考:Python + Selenium で Chrome の自動操作を一通り

2. clusterにログイン

1.ログインボタンを押す

    driver.find_element_by_class_name('Header__login').click()

2.twitterでログインを押す

    driver.find_element_by_class_name('LoginModalDialog__twitter').click()

3.twitterにログインする
作成したkeys.pyからusernamepasswordをインポートしてログインします。

from keys import username, password

    # send username
    driver.find_element_by_id('username_or_email').send_keys(username)

    # send password
    driver.find_element_by_id('password').send_keys(password)

    # send submit
    driver.find_element_by_class_name('buttons').submit()

4.待つ
ログイン処理に時間がかかるので、適当に待ちます。

    time.sleep(10)

clusterにtwitter以外のログイン方法をしている方は2,3を書き換えると良いと思います。

3. ページをスクロールしながら読み込んでDL用のリストの作成

cluster内で撮った写真の一覧が見れるページ(https://cluster.mu/account/photos )に移動します。
このページは表示が必要になるまで画像を読み込まないので、そのままソースコードを取り出してもほぼからです。
なので、forループの中で

driver.execute_script("window.scrollTo(0, {});".format(i * 60))

を使ってページをスクロールします。

そして、imgタグからsrcを取り出すと、ほしい画像のサムネイルが取れます。
ほしい画像のurlと、そのサムネイルのurlはfilesupdatedになり、/thumbnail.png.pngになる程度の違いなのでreplaceしていきます。

def thumbnail_to_large_img(url_text: str) -> str:
    return url_text.replace("files", "uploads")[:-14]+".png"

4. ダウンロード

先程のurlをリスト化してforループでダウンロードしていきます。
この時、time.sleepでちょっと待ちながらダウンロードしていきましょう。

def download_img(url: str):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open("img/"+url.split('/')[-1], 'wb') as f:
            f.write(r.content)

for url in tqdm(dl_list):
    download_img(url)
    time.sleep(1)

この時imgを指定のパスにすれば保存したい場所に保存することが可能です。
参考:python3のrequestsを使って画像を保存

ソースコード

こちら

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2