今天给大家分享使用 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 语言爬取外交部官网驻外报道
评论