LoginSignup
9
13

More than 5 years have passed since last update.

JSで生成されるページをRSelenium +rvestでスクレイピング

Last updated at Posted at 2019-03-10

はじめに

ちょっと趣味で、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/ にアクセスして次のようにページにアクセスできるかを確認します。

image.png

次に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/

できました。
これで分析ができるようになりそうです。

参考

9
13
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
9
13