4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RでQiitaの記事をスクレイピングしよう

Last updated at Posted at 2020-01-09

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)

RRstudioパッケージのアップデート 

趣旨

何だかんだよく忘れるので備忘録として
必要最低限やればいいことを書いておく... 

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の説明あり】|さぎのみや家の事情

class="it-Header_title"要素を取得
> qiita.article %>% html_nodes(xpath = '//*[@class="it-Header_title"]')
{xml_nodeset (1)}

[1] <h1 class="it-Header_title" itemprop="headline">RRstudioパッケージのアップデ ...

//*[@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(上に同じ)からテキストだけを抽出する。

おしまい。

  1. 厳密には違うが、ノードは、階層型のオブジェクトであるXMLの各階層(各要素)を指す。

4
6
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
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?