アイドルで理解する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のバージョンに合ったものを各自インストールしてください。
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は名字がつよいメンバーが多い。山縣とか岩倉とか武者とか。明治時代みがある。
今回のコード全体は以下のリポジトリに置いてます。