R(インターネット)

2026年2月18日 (水)

[R]ウェブサイトの応答ヘッダーの取得に失敗する

curlGetHeaders関数は、ウェブサイトの応答ヘッダーを得ることができるが、外部の一般のウェブサイト(グーグルやヤフー)は読み取れるのにlocalhostやイントラのウェブサイトが読み取れないことがある。この場合、内部のウェブサイトはプロキシを経由しないで直接接続する設定になっていると考えられる。そのため、特定のURLではプロキシを使わないような設定にすればよい。

プロキシを使わずに接続するドメインを、Sys.setenv関数を使って環境変数no_proxyに設定すればよい。複数ある場合はコンマで区切って指定する。

> curlGetHeaders("https://www.google.co.jp") |> head(1)
[1] "HTTP/1.1 200 Connection established\r\n"
> curlGetHeaders("http://localhost") |> head(1)
[1] "HTTP/1.0 403 Forbidden\r\n"
> curlGetHeaders("http://intra.company.co.jp") |> head(1)
[1] "HTTP/1.0 502 Bad Gateway\r\n"
> Sys.setenv("no_proxy" = "localhost,intra.company.co.jp,123.456.78.9")
> curlGetHeaders("http://localhost") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"
> curlGetHeaders("http://intra.company.co.jp") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"
> curlGetHeaders("http://123.456.78.9") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"

URLにIPアドレスを直接指定する場合もあるだろうが、そのような場合read_htmlはまったく応答せずしばらくR自体が停止したような状態になってしまうが、上記の例のとおりにそのまま書き込めば、応答するようになる。

2026年2月17日 (火)

[R]エラーメッセージ「open.connection(x, "rb") でエラー: コネクションを開くことができません」

rvestパッケージのread_html関数でウェブサイトの情報を読み取ると、読み取りに失敗してこのメッセージが表示される場合がある。外部の一般のウェブサイト(グーグルやヤフー)は読み取れるのにlocalhostやイントラのウェブサイトが読み取れないことがある。この場合、内部のウェブサイトはプロキシを経由しないで直接接続する設定になっていると考えられる。そのため、特定のURLではプロキシを使わないような設定にすればよい。

> library(rvest)
> html <- read_html("https://www.google.co.jp")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://localhost")
open.connection(x, "rb") でエラー: コネクションを開くことができません
> html <- read_html("http://intra.company.co.jp")
open.connection(x, "rb") でエラー: コネクションを開くことができません

プロキシを使わずに接続するドメインを、Sys.setenv関数を使って環境変数no_proxyに設定すればよい。複数ある場合はコンマで区切って指定する。

> Sys.setenv("no_proxy" = "localhost,intra.company.co.jp,123.456.78.9")
> html <- read_html("http://localhost")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://intra.company.co.jp")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://123.456.78.9")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"

URLにIPアドレスを直接指定する場合もあるだろうが、そのような場合read_htmlはまったく応答せずしばらくR自体が停止したような状態になってしまうが、上記の例のとおりにそのまま書き込めば、応答するようになる。

2026年2月 3日 (火)

[R]Webサイトのページを読み取る

rvectパッケージのread_html関数を使う。以下は、宮内庁の公式ウェブサイトの、天皇皇后両陛下の紹介ページを抜き出した例。戻り値はリスト。専用の関数を使うことで、当該ページ内の各種情報(表など)をきれいに取り出すことができる。

> library(rvest)
> r <- read_html("https://www.kunaicho.go.jp/about/history/history02.html")
> typeof(r)
[1] "list"
> mode(r)
[1] "list"
> class(r)
[1] "xml_document" "xml_node"

2025年10月17日 (金)

[R]ウェブサイトのページの表の中身を読み取る

rvectパッケージのhtml_table関数を使う。あらかじめread_html関数でページを読み取っておくこと。以下は、宮内庁の公式ウェブサイトの天皇皇后両陛下の紹介ページを2025年9月に抜き出した例。ページ内に表は四つあり、一つ目と二つ目の中身をそれぞれ表示している。ページから表は一括でしか読み取れないが、その際、表にヘッダ行がある場合は、headerオプションにTRUEを指定すること。

> library(rvest)
> html <- read_html("https://www.kunaicho.go.jp/about/history/history02.html")
> tbl <- html |> html_table(header = FALSE)
> length(tbl)
[1] 4
> mode(tbl)
[1] "list"
> tbl[[1]] |> as.data.frame() |> head(8)
X1 X2
1 お名前 徳仁(なるひと)
2 お続柄 上皇第1皇男子
3 お誕生日 昭和35年2月23日
4 ご称号 浩宮(ひろのみや)
5 お印 梓(あずさ)
6 成年式 昭和55年2月23日(ご年齢20歳)
7 立太子の礼 平成3年2月23日
8 ご即位 令和元年5月1日
> tbl[[2]] |> as.data.frame() |> head(5)
X1 X2
1 お名前 雅子(まさこ)
2 お続柄 小和田恆(おわだひさし)氏第1女子
3 お誕生日 昭和38年12月9日
4 お印 ハマナス
5 総裁職など 日本赤十字社 名誉総裁

2025年4月16日 (水)

[R]インターネット上のファイルをダウンロードする

download.file関数を使う。第一引数にダウンロードしたいインターネット上のファイルをURLで、第二引数に保存するファイル名を指定する。以下は、2025年4月に、プロジェクト・グーテンベルクに掲載されている「赤毛のアン」の原著をテキストで納めているテキストファイルをダウンロードして、一時的なファイル名で保存した例。

当該ファイルは文字コードはUTF-8(BOM付き)、改行コードはCR+LFで保存されており、download.file関数のmodeオプションに"wb"を指定しないと、ダウンロード時に改行コードをCR+CR+LFに変換して保存するので注意(it does distinguish between text and binary files and for text transfers changes ‘\n’ line endings to ‘\r\n’ (aka ‘CRLF’).)。

> urlname <- "https://www.gutenberg.org/ebooks/45.txt.utf-8"
> filepath <- tempfile()
> download.file(urlname, filepath, mode = "wb")
URL 'https://www.gutenberg.org/ebooks/45.txt.utf-8' を試しています
Content type 'text/plain; charset=utf-8' length 606739 bytes (592 KB)
downloaded 592 KB

ダウンロードしたファイルを試しに読み込んでみる。最後に、ダウンローしたファイルは削除している。

> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> lines <- read_lines(filepath, locale = locale(encoding = "UTF-8"))
> head(lines, 15)
[1] "The Project Gutenberg eBook of Anne of Green Gables"
[2] " "
[3] "This ebook is for the use of anyone anywhere in the United States and"
[4] "most other parts of the world at no cost and with almost no restrictions"
[5] "whatsoever. You may copy it, give it away or re-use it under the terms"
[6] "of the Project Gutenberg License included with this ebook or online"
[7] "at www.gutenberg.org. If you are not located in the United States,"
[8] "you will have to check the laws of the country where you are located"
[9] "before using this eBook."
[10] ""
[11] "Title: Anne of Green Gables"
[12] ""
[13] "Author: L. M. Montgomery"
[14] ""
[15] "Release date: June 27, 2008 [eBook #45]"
> tail(lines, 5)
[1] "including how to make donations to the Project Gutenberg Literary"
[2] "Archive Foundation, how to help produce our new eBooks, and how to"
[3] "subscribe to our email newsletter to hear about new eBooks."
[4] ""
[5] ""
> file.remove(filepath)
[1] TRUE

2025年1月 9日 (木)

[R]行政機関の営業日数を求める

行政機関の休日は、土日祝日と12/31~1/3。これを指定の年度の日付型ベクトルから取り除けばよい。以下は2024年度(2024-04-01/2025-03-31)の行政機関の営業日数を調べた例。土日と年末年始はweekdays関数を使えば機械的に取り除ける。祝日の判定には、内閣府のウェブサイトで公開されている祝日をCSV形式で納めたファイルを利用している。2024年11月現在、昭和30年(1955年)~令和7年(2025年)の祝日が納められている。

> # 下準備
> library(tidyverse)
> options(readr.show_progress = FALSE, readr.show_col_types = FALSE)
> loc <- locale(encoding = "Shift_JIS")
> s <- "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
> hday <- read_csv(s, locale = loc)
> colnames(hday) <- c("date", "name")
> hday$date <- as.Date(hday$date)
> # 営業日数を計算する年度を西暦で指定
> nendo <- 2024
> # 営業日数の計算開始
> dt1 <- as.Date(ISOdate(nendo, 4, 1))
> dt2 <- as.Date(ISOdate(nendo + 1, 3, 31))
> # まずは年度のすべてを日(365or366日)を作成
> bday <- tibble(date = seq(dt1, dt2, by = "day"))
> # 当該年度のすべての日に曜日情報を追加
> bday <- bday |> mutate(wday = weekdays(date, abbreviate = TRUE))
> # すべての日から土日を取り除く
> bday <- bday |> filter(!str_detect(wday, "土|日"))
> # (すべての日)-(土日)-(祝日)
> bday <- bday |> anti_join(hday, by = join_by(date == date))
> # 最後に年末年始の6日間を取り除く(土日祝日削除で既に無い可能性有り)
> dth1 <- as.Date(ISOdate(nendo, 12, 29))
> dth2 <- as.Date(ISOdate(nendo + 1, 1, 3))
> bday <- bday |> filter(date < dth1 | date > dth2)
> # 結果を出力
> cat(sprintf("%d年度の営業日数は %d 日\n", nendo, nrow(bday)))
2024年度の営業日数は 243 日

2024年3月30日 (土)

[R]ウェブサイトのページの文字コードを調べる

rvestパッケージのread_html関数とhtml_node関数を組み合わせて使う。以下の例では、ページの文字コードがUTF-8であることがわかる。

> library(dplyr)
> library(rvest)
> s <- "https://www.kunaicho.go.jp"
> html <- read_html(s)
> html %>% html_node(xpath = "//meta[@content | @charset]")
{html_node}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

2024年3月28日 (木)

[R]パーセントエンコーディングを行う

URLencode関数を使う。

> URLencode("和多田美咲")
[1] "%E5%92%8C%E5%A4%9A%E7%94%B0%E7%BE%8E%E5%92%B2"

試しに、このパーセントエンコーディングを使用して、Googleで「和多田美咲」で検索した結果のページを開いてみる。

> s <- "https://www.google.co.jp/search?q="
> s <- paste0(s, URLencode("和多田美咲"))
> print(s)
[1] "https://www.google.co.jp/search?q=%E5%92%8C%E5%A4%9A%E7%94%B0%E7%BE%8E%E5%92%B2"
> browseURL(s)

R_urlencode

2024年3月25日 (月)

[R]URLをブラウザーで開く

browseURL関数を使う。Googleのトップページを既定のブラウザーで開いてみる。

> browseURL("https://www.google.co.jp")

起動するブラウザーを指定する場合はbrowserオプションにブラウザーの本体(.exe)をフルパスで指定する。browserオプションを指定した場合、ブラウザーの起動に成功すると0、失敗知ると0以外の戻り値が返る。Windows 10でEdgeを指定して開く場合は以下の最後の例のようになる。

> browseURL("https://www.google.co.jp", browser = "C:/Program Files (x86)/Microsoft/firefox.exe")
[1] 127
警告メッセージ:
system(paste0("\"", browser, "\" ", if (encodeIfNeeded) URLencode(url) else url), で:
'"C:/Program Files (x86)/Microsoft/firefox.exe"' not found
> browseURL("https://www.google.co.jp", browser = "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe")
[1] 0

2023年12月24日 (日)

[R]郵便番号の一覧を得る

以下は2023年12月中旬に、日本郵便株式会社のウェブサイトから郵便番号の情報が納められたファイルをダウンロードして、郵便番号とそれに対応する町域等をデータフレームにした例。UTF-8形式のファイルをダウンロードしている。ダウンロードしたファイルはテンポラリファイルとして保存をして削除をしているが、そのファイルから展開したファイル(utf_ken_all.csv)はカレントディレクトリに保存をして、そのまま残していることに注意。

> url <- "https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip"
> tfile <- tempfile()
> download.file(url, tfile)
URL 'https://www.post.japanpost.jp/zipcode/dl/utf/zip/utf_ken_all.zip' を試しています
Content type 'application/zip' length 2030910 bytes (1.9 MB)
downloaded 1.9 MB
> unzip(tfile)
> unlink(tfile)
> file.info(dir(pattern = "utf_ken_all\\.csv"))["size"]
size
utf_ken_all.csv 18333268
> zip <- read.table("utf_ken_all.csv", sep = ",", colClasses = "character")

町域で検索を試してみる。レゴランドジャパンが位置する住所(金城ふ頭)を検索してみると、一か所しか登録されていないことがわかる。ユニバーサル・スタジオ・ジャパンが位置する「桜島」も同様。「安野」が含まれる町域は複数あるが「希世乃」という町域は一か所も登録されていないことがわかる。

> subset(zip, grepl("^金城ふ頭$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
67272 4550848 愛知県 名古屋市港区 金城ふ頭
> subset(zip, grepl("^桜島$", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
84513 5540031 大阪府 大阪市此花区 桜島
> subset(zip, grepl("安野", V9), c(V3, V7, V8, V9))
V3 V7 V8 V9
47777 9592003 新潟県 阿賀野市 安野町
47936 9592004 新潟県 阿賀野市 南安野町
49858 9300087 富山県 富山市 安野屋町
110837 7890253 高知県 長岡郡大豊町 安野々
114419 8380213 福岡県 朝倉郡筑前町 安野
> subset(zip, grepl("希世乃", V9), c(V3, V7, V8, V9))
[1] V3 V7 V8 V9
<0 行> (または長さ 0 の row.names)
無料ブログはココログ

■■

■■■