我有一个项目,应该在新闻网站上抓取一系列文章。我对新闻的标题和文字感兴趣。在大多数情况下,该网站维护一个基本URL,例如:
https://www.americanthinker.com /articles/2019/11/why_rich_people_love_poor_immigrants.html https://tmp.americanthinker.com /blog/2015/01/california_begins_giving_drivers_licenses_to_illegal_aliens.html
由于要下载的文章过多(超过1000篇),我想到了创建一个自动下载所有数据的功能。向量将提供所有网址(每行一个):
article
[1] "https://www.americanthinker.com/articles/2019/11/why_rich_people_love_poor_immigrants.html"
[2] "https://tmp.americanthinker.com/blog/2015/01/california_begins_giving_drivers_licenses_to_illegal_aliens.html"
[3] "https://www.americanthinker.com/articles/2018/11/immigrants_will_not_fund_our_retirement.html"
> str(article)
chr [1:3] "https://www.americanthinker.com/articles/2019/11/why_rich_people_love_poor_immigrants.html" ...
> summary(article)
Length Class Mode
3 character character
因此,脚本将使用矢量作为地址的来源,并使用每篇文章的标题和文本创建一个数据框。但是会弹出一些错误。这是我根据一系列Stack Overflow帖子编写的代码:
包装
library(rvest)
library(purrr)
library(xml2)
library(dplyr)
library(readr)
导入CSV并导出为矢量
base <- read_csv(file.choose(), col_names = FALSE)
article <- pull(base,X1)
第一次尝试
articles_final <- map_df(article, function(i){
pages<-read_html(article)
title <-
article %>% map_chr(. %>% html_node("h1") %>% html_text())
content <-
article %>% map_chr(. %>% html_nodes('.article_body span') %>% html_text() %>% paste(., collapse = ""))
article_table <- data.frame("Title" = title, "Content" = content)
return(article_table)
})
第二次尝试
map_df(1:3, function(i){
page <- read_html(sprintf(article,i))
data.frame(Title = html_text(html_nodes(page,'.h1')),
Content= html_text(html_nodes(page,'.article_body span')),
Site = "American Thinker"
)
}) -> articles_final
在两种情况下,运行这些功能时都出现以下错误:
Error in doc_parse_file (con, encoding = encoding, as_html = as_html, options = options):
Expecting a single string value:
[type = character; extent = 3].
我需要它来下载和分析文章
非常感谢您的帮助。
修改
我尝试了下面的代码:
I tried and it dod not work, some problem with my coding:
> map_dfc(.x = article,
+ .f = function(x){
+ foo <- tibble(Title = read_html(x) %>%
+ html_nodes("h1") %>%
+ html_text() %>%
+ .[nchar(.) > 0],
+ Content = read_html(x) %>%
+ html_nodes("p") %>%
+ html_text(),
+ Site = "AmericanThinker")%>%
+ filter(nchar(Content) > 0)
+ }
+ ) -> out
Error: Argument 3 must be length 28, not 46
但是当您看到一个新错误弹出时
答案 0 :(得分:1)
这是我为您尝试的。我在玩Selector小工具并检查页面源。经过检查,我认为您需要使用
spring.data.mongodb.username = user
spring.data.mongodb.password = pass
spring.data.mongodb.host = 172.17.0.2
spring.data.mongodb.port = 27017
spring.data.mongodb.database = test_db
和<title>
。 <div class="article_body">
部分将遍历map()
中的三篇文章,并创建一个数据框。每行代表每篇文章。我认为您仍然需要进行一些字符串操作才能获得干净的文本。但这将帮助您抓取所需的内容。
article