网络抓取带有困难节点的分页网站

问题描述 投票:0回答:1

我在刮ASN数据库(http://aviation-safety.net/database/)。我已经编写了代码来分析每一年(1919-2019),并刮除除死亡之外的所有相关节点(表示为“胖”)。 Selector Gadget告诉我,死亡节点被称为“'#contentcolumnfull:nth-​​child(5)'”。出于某种原因,“。list:nth-​​child(5)”不起作用。

当我刮掉#contentcolumnfull:nth-​​child(5)时,第一个元素是空白的,表示为“”。

如何编写一个函数来删除每年/每页被删除的第一个空元素?当我单独抓取一个页面时,删除第一个元素很简单:

fat <- html_nodes(webpage, '#contentcolumnfull :nth-child(5)')
fat <- html_text(fat)
fat <- fat[-1]

但我发现写入函数很困难。

我还有关于日期时间和格式的第二个问题。我的日期数据表示为日 - 月 - 年。缺少几个元素日和月(例如:?? - ?? - 1985,JAN - ?? - 2004)。理想情况下,我想将日期转换为一个重要的对象,但我不能缺少数据,或者我只保留年份。

此时,我已经使用gsub()和regex来清理数据(删除“??”和浮动破折号),所以我有一个混合的数据格式包。但是,这使得难以可视化数据。关于最佳实践的想法?

# Load libraries 
library(tidyverse)
library(rvest)
library(xml2)
library(httr)

years <- seq(1919, 2019, by=1)

pages <- c("http://aviation-safety.net/database/dblist.php?Year=") %>%
  paste0(years) 

# Leaving out the category, location, operator, etc. nodes for sake of brevity 
read_date <- function(url){
  az <- read_html(url)
  date <- az %>%
    html_nodes(".list:nth-child(1)") %>%
    html_text() %>%
    as_tibble()
} 

read_type <- function(url){
  az <- read_html(url)
  type <- az %>%
    html_nodes(".list:nth-child(2)") %>%
    html_text() %>%
    as_tibble()
}

date <- bind_rows(lapply(pages, read_date))
type <- bind_rows(lapply(pages, read_type))

# Writing to dataframe
aviation_df <- cbind(type, date)
aviation_df <- data.frame(aviation_df)

# Excluding data cleaning 
r web-scraping rvest lubridate
1个回答
0
投票

为了提取所请求的信息,不止一次ping同一页面是不好的做法。您应该阅读页面,提取所有所需信息,然后转到下一页。

在这种情况下,各个节点都存储在一个主表中。 rvest的html_table()函数很方便将html表转换为数据框。

library(rvest)
library(dplyr)

years <- seq(2010, 2015, by=1)

pages <- c("http://aviation-safety.net/database/dblist.php?Year=") %>%
  paste0(years) 

# Leaving out the category, location, operator, etc. nodes for sake of brevity 
read_table <- function(url){
  #add delay so that one is not attacking the host server (be polite)
  Sys.sleep(0.5)
  #read page
  page <- read_html(url)
  #extract the table out (the data frame is stored in the first element of the list)
  answer<-(page %>% html_nodes("table") %>%  html_table())[[1]]
  #convert the falatities column to character to make a standardize column type
  answer$fat. <-as.character(answer$fat.)
  answer
} 

# Writing to dataframe
aviation_df <- bind_rows(lapply(pages, read_table))

这是一些需要清理的额外列

© www.soinside.com 2019 - 2024. All rights reserved.