使用 R 语言爬取外交部官网驻外报道

今天给大家分享使用 R 语言爬取外交部官网驻外报道的方法。

我们的目标是爬取每篇报道的文本:

爬取所有报道的链接

首先我们需要获取所有的报道链接。

经过分析可以发现,第一页的网址是:https://www.mfa.gov.cn/web/wjdt_674879/zwbd_674895/index.shtml ,然后后面的网址都是类似:https://www.mfa.gov.cn/web/wjdt_674879/zwbd_674895/index_28.shtml 的形式:

library(tidyverse)
library(rvest)

c("https://www.mfa.gov.cn/web/wjdt_674879/zwbd_674895/index.shtml",
paste0("https://www.mfa.gov.cn/web/wjdt_674879/zwbd_674895/index_", 1:28, ".shtml")) %>%
lapply(function(x){
read_html(x) %>%
html_elements("li") %>%
html_elements("a") %>%
as.character() %>%
as_tibble() %>%
filter(str_detect(value, '<a href="\\./(.*)html')) %>%
mutate(title = str_match(value, ">(.*)<")[,2],
href = str_match(value, 'href="(.*)"\\star')[,2]) %>%
select(title, href) %>%
mutate_all(~str_remove_all(.x, " ")) %>%
mutate(href = str_replace_all(href, "\\./", "https://www.mfa.gov.cn/web/wjdt_674879/zwbd_674895/"))
}) %>%
bind_rows() -> df

df

这样我们就获取了所有报道的标题和链接。

爬取报道文本

例如第一个链接,文本可以这样获取:

df$href[1] %>%
read_html() %>%
html_elements("div.main") %>%
html_text() %>%
paste0(collapse = "") %>%
str_remove_all("\\n") %>%
str_remove_all("\\s{2}")

那么所有的报道就可以写个 map 循环获得:

df %>%
mutate(text = map_chr(href, function(x){
try({
read_html(x) %>%
html_elements("div.main") %>%
html_text() %>%
paste0(collapse = "") %>%
str_remove_all("\\n") %>%
str_remove_all("\\s{2}")
})
})) -> df

df

df %>%
haven::write_dta("爬取结果.dta")

这样就解决了这个问题。

点击这里跳转到 RStata 短书平台获取附件:使用 R 语言爬取外交部官网驻外报道

评论