前回に引き続いて今回は実際のWebサイトをスクレイピングしていきます。というわけで新世紀エヴァンゲリオンのWikipediaのデータ(新世紀エヴァンゲリオン – Wikipedia)をスクレイピングしてタグや文字の検索・抽出を行っていきます。
###サイトのデータを取り込む###
> eva<-read_html(“https://ja.wikipedia.org/wiki/新世紀エヴァンゲリオン”)
###取り込んだデータの確認###
> eva
{xml_document}
<html class=”client-nojs” lang=”ja” dir=”ltr”>
[1] <head>\n<meta http-equiv=”Content-Type” content=”text/html; charset=UT …
[2] <body class=”mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subje …
>
取り込んだサイトデータの全容を把握したいのならば、サイトのページで右クリック⇨ページのソースでそのサイトのHTML構成を見ることが可能です。ちなみにこのページならこんな感じです。
見出しの抽出
ここからまず見出しの<h1>タグを抽出していきます。
###見出しの抽出### > eva %>% html_nodes("h1") {xml_nodeset (1)} [1] <h1 id="firstHeading" class="firstHeading" lang="ja">新世紀エヴァンゲリオン</h1> ###見出しの文字だけを抽出### > eva %>% html_nodes("h1")%>%html_text [1] "新世紀エヴァンゲリオン"
リンクの抽出
次はリンクを抽出します。
###リンクの抽出### > eva %>% html_nodes("a") %>% html_attr("href") [1] NA [2] "#mw-head" [3] "#p-search" [4] "/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Question_book-4.svg" [5] "/wiki/Wikipedia:%E6%A4%9C%E8%A8%BC%E5%8F%AF%E8%83%BD%E6%80%A7" [6] "/wiki/Wikipedia:%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E6%83%85%E5%A0%B1%E6%BA%90"
パイプ演算子で特定の部分だけ抽出する
抽出したノードはDOMという形式で階層上に枝分かれした状態で保存されています。なので階層を指定して、その部分にあるタグのみを抽出することも可能です。階層の指定はdplyrをインポートすると使えるパイプ演算子を使うと便利です。
###head部分のみを抽出する### > eva %>% html_nodes(xpath="/html/head") {xml_nodeset (1)} [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF- ... ###テーブル(表)の抽出 eva %>% html_nodes(xpath="//table") {xml_nodeset (44)} [1] <table class="plainlinks ambox ambox-content" role="presentation"><tr>\ ... [2] <table class="infobox bordered">\n<tr>\n<th colspan="2" style="backgrou ... [3] <table class="collapsible collapsed" style="background:transparent; wid ... [4] <table class="vertical-navbox nowraplinks" style="float:right;clear:rig ... [5] <table class="wikitable" width="250px" align="right" cellpadding="0" ce ... [6] <table class="wikitable" border="1">\n<tr>\n<th>機体</th>\n<th>補足</th>\n< ... ###<p>タグの要素を抽出### eva %>% html_nodes(xpath="//p") {xml_nodeset (94)} [1] <p>『<b>新世紀エヴァンゲリオン</b>』(しんせいきエヴァンゲリオン、<i>Neon Genesis EVANGELION</i>)は、 ... [2] <p><a href="/wiki/%E5%BA%B5%E9%87%8E%E7%A7%80%E6%98%8E" title="庵野秀明">庵野 ... [3] <p><a href="/wiki/1995%E5%B9%B4" title="1995年">1995年</a>10月4日から<a href= ... [4] <p>漫画とアニメの<a href="/wiki/%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%83%9F% ... [5] <p><a href="/wiki/2006%E5%B9%B4" title="2006年">2006年</a>には、本作を新たな設定・ストー ... [6] <p>本作品の著作権者表記はテレビ版に関しては「GAINAX/Project Eva.・テレビ東京」、劇場版に関しては「GAINAX/EVA制 ... [7] <p>物語の舞台は<a href="/wiki/%E8%A5%BF%E6%9A%A6" title="西暦">西暦</a><a href="/ ... [8] <p>当初はゲンドウの命令で、そして<b>EVA零号機</b>のパイロットである少女<b><a href="/wiki/%E7%B6%BE%E ... [9] <p>しかし、<a href="/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E5%90%88%E8% ... [10] <p>自らが乗ったEVAの手で友人が足を切断する大怪我を負ったことで、シンジはEVAのパイロットを辞めるが、そこに強大な力をもつ第14使徒が現 ... [11] <p>しかし第15使徒との戦いにおいてアスカが精神攻撃を受け廃人となり…
“//table”のように要素名の前に//をつけると、階層が異なるすべての要素を抽出できます。
終わり
またR言語を使用したwebスクレイピングについて、本格的に勉強するならば「Rによるスクレイピング入門」という参考書がオススメです。入門と書いてますが実務で使えるレベルのことが分かりやすく書いてあります。
コメント