蛇ノ目の記

技術のことも。そうでないことも。

アイドルで理解するSelenium - リンクを見つけて移動するだけ

アイドルで理解するhogehogeシリーズです。

やること

アイドルを応援するプラットフォームCHEERZから、任意のアイドルの画像をダウンロードする。

基本無料だけど課金すると応援するためのポイントが回復できたりするらしい。アカウント持ってないのでよくわからない。

ちなみにrobots.txtは以下の通り。スクレイピングすること自体は禁止されていない。

User-agent: *
Disallow:

Seleniumでやること

https://cheerz.cz/artist/{artist_id}/community というページをクローリングして画像をダウンロードする。

Fuka Kanzaki:コミュニティ - CHEERZ -

この /community というページには円形のサムネイルしかないように見えるけど、実はこのサムネイルは大きいサイズの画像をCSSで加工しているだけ。

なので元の画像を容易に取ってこれる。

pageNext というidのa要素から次のページに遷移するので、こいつをSeleniumでクリックさせてすべてのページをクローリングする。

コード

webdriver.Chrome.find_element_by_id() でidによる要素の検索ができる。こいつに pageNext を渡して、要素を抽出。抽出した要素はWebElement 型のオブジェクトとして扱われる。公式ドキュメントのWebElementの項目を見る感じだと、フォーム入力やスクショもできるっぽい。

webdriver.Chrome.page_source でそのページのソースコードを取得。取得したソースコードは後でBeautifulsoupで解析するためにリストに格納。

抽出したa要素を WebElement.click() でクリック。次のページに遷移する。

クリックできる要素がないときはElementClickInterceptedExceptionが送出されるので、補足してwebdriver.Chrome を閉じて終了。

def get_pages(driver: webdriver.Chrome, url: str) -> List[str]:
    """

    Parameters
    ----------
    driver: webdriver.Chrome
        webdriver
    url: str
        URL for CHEERZ artist community page.

    Returns
    -------
    pages: List[str]
        List of page source of CHEERZ artist community page.

    """
    pages = []
    driver.get(url)
    print('Fetch page sources.')
    while True:
        try:
            next_page = driver.find_element_by_id('pageNext')
            html = driver.page_source
            pages.append(html)
            next_page.click()
        except ElementClickInterceptedException:
            driver.close()
            driver.quit()
            print(f'Accomplished. {len(pages)} sources has fetched.')
            return pages

まあ後は大したことしてないです。Selenium使ってる箇所も大したことしてないんだけども。

動作例

README.mdにも書いてるんですが、これを使いたいときはchromedriver-binaryは手元のChromeのバージョンに合ったものを各自インストールしてください。

pypi.org

chromedriver-binary をインポートするだけで、Seleniumを動かすのに必要なChromeのパスの設定がいい感じになる。

(venv) $ python scraping.py
CHEERZ artist ID: 880
directory name (Optional. Default is artist id.): kanzaki fuka
Fetch page sources.
Accomplished. 44 sources has fetched.
Extract image URLs.
Accomplished. 865 URLs has extracted.
Save images.
100%|████████████████████| 865/865 [06:08<00:00,  2.35it/s]
Accomplished.

こんな感じ。風花ちゃんは、というかオサカナはもうCHEERZを更新しなくなっているんですが865枚も画像あるんすね。オサカナだと他に寺口夏花ちゃんが投稿してます。artist_idは881ですよ、てらさん推しの皆さん。

現在もCHEERZを更新しているアイドルに対応しておきたいので、差分ダウンロードもできるようになってます。

PANDAMICの山縣絆奈ちゃんで試した例。

Yamagata Hanna:コミュニティ - CHEERZ -

(venv) $ python scraping.py
CHEERZ artist ID: 8466
directory name (Optional. Default is artist id.): yamagata hanna
Fetch page sources.
Accomplished. 7 sources has fetched.
Extract image URLs.
Accomplished. 135 URLs has extracted.
Save images.
Exist images: 133
New Images: 2
100%|████████████████████|  2/2 [00:00<00:00,  2.31it/s]
Accomplished.

どうでもいいんですがPANDAMICは名字がつよいメンバーが多い。山縣とか岩倉とか武者とか。明治時代みがある。

今回のコード全体は以下のリポジトリに置いてます。

github.com