1. 趣旨
最近スクレイピングに挑戦中なので、素振り的な感じでやってみました。
意外とあっさりできた。
2. コード
# 今回は以下のURLの記事のタイトルと本文を引っこ抜きます。
# https://qiita.com/zakkiiii/items/1f02471d49264b4bd64a
# 必要なパッケージ
> library(rvest)
# ウェブページの取得
> qiita.article <- read_html("https://qiita.com/zakkiiii/items/1f02471d49264b4bd64a")
# 記事のタイトルの取得
> qiita.article.title <- qiita.article %>% html_nodes(xpath ='//*[@class="it-Header_title"]') %>% html_text()
# 記事本文の取得
> qiita.article.content <- html_nodes(xpath = '//*[@class="it-MdContent"]') %>% html_text()
# 一応ベクトルとしてがっちゃんこしておく。
> qiita.article.data <- (qiita.article.title, qiita.article.content)
# 中身の表示
> cat(qiita.article.data)
R・Rstudio・パッケージのアップデート
趣旨
何だかんだよく忘れるので、備忘録として。
必要最低限やればいいことを書いておく。...
3. 解説
3-1. rvestパッケージ
rvest
は、Rでのウェブスクレイピングを手助けしてくれるパッケージです。
以降登場するread_html()
などはこのパッケージを利用しています。
未導入の場合はスクリプトを実行する前に必ずダウンロードしておきましょう。
> install.packages("rvest")
3-2. ウェブページの取得
read_html()
を使用します。
深く考えず、read_csv()
と同じような感覚で使えばよいです。
引数として設定したURLからウェブページを取得しますが、出力されるオブジェクト(データ)はXML形式のような階層構造をとっています。
qiita.article <- read_html("https://qiita.com/zakkiiii/items/1f02471d49264b4bd64a")
これを、qiita.article
として格納しておきます。
3-3. 特定の情報の抽出
ブラウザのデベロッパーツールなどでスクレイピングしたいウェブページのHTMLソースを見ると、各コンテンツが以下のタグで囲われた部分にあることがわかります。
コンテンツ | タグ |
---|---|
記事タイトル | <h1 class="it-Header_title" itemprop="headline"> |
本文 | <section class="it-MdContent" itemprop="articleBody"> |
そこで、それぞれのタグで囲われた部分をqiita.article
から抜き出します。
前述の通りオブジェクト(データ)がXML形式なので、一般的なリストやデータフレームと同じ方法では抜き出すことができません。
3-3-1. 要素の抽出
html_nodes()
は、read_html()
が出力したオブジェクトから、「要素」(指定したタグ等で囲われたソースコードのこと。)を抜き出してくれる関数です。
抜き出すタグ(id、class等の引数も組み合わせて利用可能。)は、xpath
という引数で設定します。
xpathについては、こちらが分かりやすかったのでご紹介しておきます。
【R】Rを使ってXPathをスクレイピング【XPathの説明あり】|さぎのみや家の事情
> qiita.article %>% html_nodes(xpath = '//*[@class="it-Header_title"]')
{xml_nodeset (1)}
[1] <h1 class="it-Header_title" itemprop="headline">R・Rstudio・パッケージのアップデ ...
//*[@class="it-Header_title"]
の意味は、「headだろうとbodyだろうと、とにかくどこでもいいから、class="id-Header_Title"となっているところを抜き出して!」ということになります。
3-3-2. テキストの抽出
次に、html_nodes
で抜き出した要素からタグ等を取り除き、テキストだけを取り出します。
この時に使うのが、html_text()
。名前の通り、HTMLからテキストだけを抜き出してくれます。
> qiita.article %>% html_nodes(xpath ='//*[@class="it-MdContent"]') %>% html_text()
[1] "\n\n趣旨\n\n何だかんだよく忘れるので、備忘録として。\n必要最低限やればいいことを...
先のhtml_nodes()
の結果出力されたオブジェクトをそのままhtml_text()
に渡すことで、必要な要素のテキストだけを取り出すことができました。
3-4. 抽出テキストの表示
本文中の改行は改行コード\n
として出力されるので、cat()
を使えば、改行コードを反映した上で表示させることができます。
> qiita.article %>% html_nodes(xpath = '//*[@class="it-MdContent"]') %>% html_text() %>% cat()
趣旨
何だかんだよく忘れるので、備忘録として。
必要最低限やればいいことを書いておく。
4. まとめ
関数名 | 内容 |
---|---|
read_html("URL") | ウェブページの情報を、XML形式のオブジェクトとして出力する。 |
html_nodes(x, xpath = 'hoge') | x (XML文書または1つ以上のノード1) からxpathで指定した要素 (ソース) を抽出する。 |
html_text(x) | x(上に同じ)からテキストだけを抽出する。 |
おしまい。
-
厳密には違うが、ノードは、階層型のオブジェクトであるXMLの各階層(各要素)を指す。 ↩