【问题标题】:Unable to scrape news website无法抓取新闻网站
【发布时间】:2017-04-05 07:58:00
【问题描述】:

我正在从以下新闻源 rss 创建一个数据集 http://indianexpress.com/section/india/feed/

我正在从这个 xml 中读取以下数据

  • 标题
  • 标题网址
  • 发布日期

我现在使用标题 url 来获取描述(概要,在主标题下方) - 通过点击每个 url 并抓取数据

但是,我面临向量长度 (197) 与其他向量长度 (200) 不匹配的描述。 因此,我无法创建我的数据框

有人可以帮助我如何有效地抓取数据

以下代码可重现

library("httr")
library("RCurl")
library("jsonlite")
library("lubridate")
library("rvest")
library("XML")
library("stringr")

url = "http://indianexpress.com/section/india/feed/"

newstopics = getURL(url)

newsxml = xmlParse(newstopics)

title <- xpathApply(newsxml, "//item/title", xmlValue)
title <- unlist(title)

titleurl <- xpathSApply(newsxml, '//item/link', xmlValue)
pubdate <- xpathSApply(newsxml, '//item/pubDate', xmlValue)

t1 = Sys.time()
desc <- NULL

for (i in 1:length(titleurl)){

  page = read_html(titleurl[i])
  temp = html_text(html_nodes(page,'.synopsis'))
  desc = c(desc,temp)

}

print(difftime(Sys.time(), t1, units = 'sec'))

desc = gsub("\n",' ',desc)

newsdata = data.frame(title,titleurl,desc,pubdate)

我收到以下错误:

Error in data.frame(title, titleurl, desc, pubdate) : 
arguments imply differing number of rows: 200, 197

【问题讨论】:

  • 我认为问题与temp 没有为for 循环中的每次迭代返回一个值有关。尝试用desc = c(desc, paste0("", temp)) 替换desc 行——尽管需要更优雅的错误处理。
  • 我检查了 titleurl 不是到处都是空的。我假设由于每个网址都是报纸链接,它们肯定会有一个副标题

标签: r web-scraping


【解决方案1】:

您可以执行以下操作:

library(tidyverse)
library(xml2)
library(rvest)

feed <- read_xml("http://indianexpress.com/section/india/feed/")

# helper function to extract information from the item node
item2vec <- function(item){
  tibble(title = xml_text(xml_find_first(item, "./title")),
         link = xml_text(xml_find_first(item, "./link")),
         pubDate = xml_text(xml_find_first(item, "./pubDate")))
}

dat <- feed %>% 
  xml_find_all("//item") %>% 
  map_df(item2vec)

# The following takes a while
dat <- dat %>% 
  mutate(desc = map_chr(dat$link, ~read_html(.) %>% html_node('.synopsis') %>% html_text))

这会给你一个data.frame/tibble 4 列:

> glimpse(dat)
Observations: 200
Variables: 4
$ title   <chr> "Common man has no problem with note ban, says Santosh Gangwar", "Bombay High Court comes...
$ link    <chr> "http://indianexpress.com/article/india/india-news-india/demonetisation-note-ban-cash-cru...
$ pubDate <chr> "Mon, 21 Nov 2016 20:04:21 +0000", "Mon, 21 Nov 2016 20:01:43 +0000", "Mon, 21 Nov 2016 1...
$ desc    <chr> "MoS for Finance speaks to Indian Express in Bareilly, his Lok Sabha constituency.", "The...

P.S.:要获取每个 item 的所有信息,您可以使用:

dat <- feed %>% 
  xml_find_all("//item") %>% 
  map_df(~xml_children(.) %>% {set_names(xml_text(.), xml_name(.))} %>% t %>% as_tibble)

【讨论】:

    猜你喜欢
    • 2019-12-02
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多