はじめに
ちょっと趣味で、Fashionsnap.comのストリートスナップの一覧ページから、各スナップページへのURLを取得したと考えました。
rvestやwgetでページを取得してみましたが、JSで生成されている部分のソースが取得できず、うまくスクレイピングできませんでした。
いろいろ調べているとRSeleniumを使うといい感じにスクレイピングができました。
メモとして残しておこうと思います。
RSeleniumについて
webページはURLが不規則であったり、クリックをしないとファイルがダウンロードできない場合があります。
この様なページに対して、Seleniumを用いることで、コマンドでクリックやスクロール等の全ての操作を行うことができます。
Seleniumは、Webアプリケーション用テストツールであり、ブラウザの操作をシミュレート(自動化)して、Webアプリケーションの画面周りのテストを実施することができます。
そして、RSeleniumは、SeleniumをRから実行できるパッケージです。
スクレイピング
dockerでseleniumのイメージを持ってきます。
docker pull selenium/standalone-chrome
ここからはR上でやります。
dockerイメージからseleniumサーバを立ち上げます。
system("docker run -d -p 4444:4444 selenium/standalone-chrome", intern = T)
立ち上がったかは、http://0.0.0.0:4444/ にアクセスして次のようにページにアクセスできるかを確認します。
次にRSelenium::remoteDriverを利用してブラウザ(Headless Chrome)のオブジェクトとします。
library(RSelenium)
browser = remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "chrome")
ブラウザを立ち上げます。
browser$open()
ブラウザが生成できたので、目的のページにアクセスします。
アクセス後にSys.sleepを入れてページの読み込みを待つのが良いようです。
page <- 3
url <- paste0("https://www.fashionsnap.com/streetstyle/?page=",page)
browser$navigate(url)
Sys.sleep(5)
ページのソースを取得します。
pagesource <- browser$getPageSource()
最後に取得したソースをhtmlファイルに保存します。
page_html <- paste0("get_snap_page",page,".html")
write(unlist(pagesource), page_html)
ここからはrvestパッケージを使った処理です。(rvestの説明は割愛)
全aタグのherfの要素を取得します。
url_list <- read_html("get_snap_page3.html") %>%
html_nodes("a") %>%
html_attr("href") %>%
as.data.frame() %>%
mutate(URL = as.character(.)) %>%
select(URL) %>%
filter(str_detect(URL, pattern = "https://www.fashionsnap.com/streetstyle/2"))
> head(url_list)
URL
1 https://www.fashionsnap.com/streetstyle/2019-03-09/114260/
2 https://www.fashionsnap.com/streetstyle/2019-03-08/114671/
3 https://www.fashionsnap.com/streetstyle/2019-03-08/114670/
4 https://www.fashionsnap.com/streetstyle/2019-03-08/114717/
5 https://www.fashionsnap.com/streetstyle/2019-03-08/114677/
6 https://www.fashionsnap.com/streetstyle/2019-03-08/114718/
できました。
これで分析ができるようになりそうです。