本日clusterで行われた「さよなら平成カウントダウンライブ UNiON WAVE - clear -」に参加して、いっぱい写真を撮ったのですが、それらをDLする際に、いちいちボタンを押すのがめんどくさかったのでスクレイピングして一括DLするプログラムを作りました。
注意
- 現時点(2019/5/1)で公式に一括DLするシステムが無いためスクレイピングしています。公式に出てきたらそちらを使いましょう。
- clusterのアカウントをtwitterでログインしている方のみ使えます。そうでない方はプログラムを書き換える必要があります。
- プログラムを書き換える際はサーバーに配慮したリクエストになるようにしましょう。
環境
- 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で開かれてスクロールすると思います。
プログラムの説明
やってること
- selenium driverの設定
- clusterにログイン
- ページをスクロールしながら読み込んでDL用のリストの作成
- ダウンロード
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からusername
とpassword
をインポートしてログインします。
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はfiles
がupdated
になり、/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を使って画像を保存