我正在用rvest搜索一个研究项目的网站,我遇到两个问题:
1)我的循环似乎一遍又一遍地重复同一页面上的抓取,而不是继续下一页。
2)我无法在我正在抓取的链接中访问全文。换句话说,我不仅要搜索搜索结果,还要搜索每个显示链接的内容。我有代码在每个单独的页面上执行此操作(见下文),但由于有2600个链接,我想将他们的个人内容整合到抓取中(好像rvest是"点击"每个这些链接和抓取他们的内容)。
背景:法国政府页面。我正在寻找所有含有" inegalites de sante"的内容。这给出了大约2600个结果,每个页面显示30个结果。因此,我运行循环88次以收集所有结果。然而,它一遍又一遍地给我30个相同的结果,并且只是在每个结果下刮取小文本引用,而不是每个话语的全文。
library(rvest)
library(purrr)
url_base <- "http://www.vie-publique.fr/rechercher/recherche.php?replies=30&query=inegalites+de+sante&typeloi=&filter=&skin=cdp&date=1&auteur=&source=&typeDoc=&date=&sort=&filtreAuteurLibre=&dateDebut=&dateFin=&nbResult=2612&q="
map_df(1:88, function(i) {
# Progress indicator
cat(".")
pg <- read_html(sprintf(url_base, i))
data.frame(date=html_text(html_nodes(pg, ".date")),
text=html_text(html_nodes(pg, ".recherche_montrer")),
title=html_text(html_nodes(pg, ".titre a")),
stringsAsFactors=FALSE)
}) -> viepublique_data
dplyr::glimpse(viepublique_data)
write.xlsx(viepublique_data, "/Users/Etc.Etc./viepublique_data.xlsx")
以下是我用来刮取每个页面以获取全文的代码,以第一个话语(不是#34; 103000074&#34;)为例:
#### Code to scrape each individual page
website <- read_html("http://discours.vie-publique.fr/notices/103000074.html")
section <- website %>%
html_nodes(".level1 a")
section
subsection <- website %>%
html_nodes(".level2 p")
subsection
person <- website %>%
html_nodes("p:nth-child(2) , .article p:nth-child(1)")
person
text <- website %>%
html_nodes(".col1 > p")
text
title <- website %>%
html_nodes("h2")
title
非常感谢你的帮助!
答案 0 :(得分:3)
您可以执行以下操作:
require(rvest)
require(tidyverse)
require(stringr)
# The url parameter of interest is the "b" at the end
# it is used for pagination. Just plut in ther 30*(0:87) to get
# the urls of your 88 pages
url_base <- "http://www.vie-publique.fr/rechercher/recherche.php?query=inegalites%20de%20sante&date=&dateDebut=&dateFin=&skin=cdp&replies=30&filter=&typeloi=&auteur=&filtreAuteurLibre=&typeDoc=&source=&sort=&q=&b="
l_out <- 88
urls <- paste0(url_base, seq(0, by = 30, length.out = l_out))
定义帮助函数来抓取网站:
# Helper function for parsing overview
parse_overview <- function(x){
tibble(date = html_text(html_nodes(x, ".date"), TRUE),
text_1 = html_text(html_nodes(x, ".recherche_montrer"), TRUE),
title = html_text(html_nodes(x, ".titre a"), TRUE),
link = str_trim(html_attr(html_nodes(x, ".titre a"), "href")))
}
# Helper function for collapse multi-line output like person and text
collapse_to_text <- function(x){
p <- html_text(x, trim = TRUE)
p <- p[p != ""] # drop empty lines
paste(p, collapse = "\n")
}
# Parse the result itself
parse_result <- function(x){
tibble(section = html_text(html_node(x, ".level1 a"), trim = TRUE),
sub_section = html_text(html_node(x, ".level2 a"), trim = TRUE),
person = html_nodes(x, "p:nth-child(2) , .article p:nth-child(1)") %>% collapse_to_text,
text_2 = html_nodes(x, ".col1 > p") %>% collapse_to_text)
}
实际抓取工作如下:
# Scrape overview
overview_content <- urls %>%
map(read_html) %>%
map_df(parse_overview)
# scrape all pages - that may take a while... slow website
detail_content <- overview_content$link %>%
map(read_html) %>%
map_df(parse_result)
out <- bind_cols(overview_content, detail_content)
这会给你
Variables: 8
$ date <chr> "11/01/2010", "06/02/2014", "31/03/2011", "30/08/2010", "21/09/2010", "19/05/2010"
$ text_1 <chr> "En effet, l' inégalité d'information n'est pas le moindre déterminant des inégalités de santé",...
$ title <chr> "1 - Déclaration de Mme Roselyne Bachelot-Narquin, ministre de la santé et des sports, sur la ré...
$ link <chr> "http://discours.vie-publique.fr/notices/103000074.html", "http://discours.vie-publique.fr/notic...
$ section <chr> "Discours publics", "Discours publics", "Discours publics", "Discours publics", "Discours public...
$ sub_section <chr> "Les discours dans l'actualité", "Les discours dans l'actualité", "Les discours dans l'actualité...
$ person <chr> "Personnalité, fonction : BACHELOT-NARQUIN Roselyne.\nFRANCE. Ministre de la santé et des sports...
$ text_2 <chr> "ti : Madame la ministre, chère Fadela,Monsieur le directeur général de la santé, cher Didier Ho...