通过多个页面抓取 Web 表格(缺少某些行)

Posted

技术标签:

【中文标题】通过多个页面抓取 Web 表格(缺少某些行)【英文标题】:Scraping a web table through multiple pages (some rows are missing) 【发布时间】:2021-12-31 01:30:42 【问题描述】:

我想使用rvest 从https://irelandsgreatwardead.ie/the-archive/ 刮一张表(包含关于 31,385 名士兵的信息)。

library(rvest)
library(dplyr)

page <- read_html(x = "https://irelandsgreatwardead.ie/the-archive/")    
table <- page             %>% 
  html_nodes("table")     %>%  
  html_table(fill = TRUE) %>%
  as.data.frame()

这有效,但仅适用于前 10 名士兵。在源代码中,我也只能看到前 10 名士兵的信息。任何有关如何与其他士兵一起获得行数的帮助将不胜感激!

谢谢,祝你有美好的一天!

【问题讨论】:

如果你使用第2页等的链接,你能得到下10个吗? 感谢您的评论,卡卢姆!不幸的是,第 2 页的 URL 与第 1 页的 URL 相同。还是您引用了其他内容? 【参考方案1】:

这里是RSelenium 解决方案,

您可以循环页面提取表并加入上一个表。

首先启动浏览器,

  library(RSelenium)
    driver = rsDriver(browser = c("firefox"))
    remDr <- driver[["client"]]
    remDr$navigate(url)

第 1 部分:从第一页提取表格并存储在 df

df = remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_table() 
df = df[[1]]
#removing last row which is non-esstential
df = df[-nrow(df),]

第 2 部分:循环浏览第 2 页到第 5 页

for(i in 2:5) 
#Building xpath for each page
xp = paste0('//*[@id="table_1_paginate"]/span/a[', i, ']')
cc <- remDr$findElement(using = 'xpath', value = xp)
cc$clickElement()

# Three second gap is given for the webpage to load
Sys.sleep(3)
df1 = remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_table() 
df1 = df1[[1]]
df1 = df1[-nrow(df1),]

#Joining previous table `df` and present table `df1`
df = rbind(df, df1)

第 3 部分:循环浏览其余的第 6 至 628 页

剩余页面的xpath 保持不变。因此,我们必须重复此代码块 623 次才能从剩余页面中获取表格。

for (i in 1:623) 
x = i
cc <- remDr$findElement(using = 'xpath', value = '//*[@id="table_1_paginate"]/span/a[4]')
cc$clickElement()
Sys.sleep(3)
df1 = remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_table() 
df1 = df1[[1]]
df1 = df1[-nrow(df1),]
df = rbind(df, df1)

现在我们有了df,里面有所有士兵的信息。

【讨论】:

非常感谢您的帮助!你的代码极大地帮助我抓取了前 50 名士兵的信息。您对我如何访问下一页中列出的其他士兵(总共 31,385 名士兵)有什么建议吗?在类似的项目中,我使用了一个遍历页面 URL 的 for 循环。不幸的是,这种方法在这里不起作用,因为当您转到另一个页面时 URL 不会改变。 我没有过多地使用 selenium,但我认为它可以提交要在页面表单上显示为“全部”的数字。我还假设需要增加超时! 呃。那个表结构太可怕了。到目前为止,我一直在手机上浏览它。整个互动都很糟糕。 编辑答案以循环浏览页面。 这太棒了!!它仅在 i= 6 或更高时给出错误消息,与@CALUMPolwart 提到的内容有关。您对如何解决此问题以从第 6 页开始增加页码有任何提示吗?【参考方案2】:
library(RSelenium)
driver = rsDriver(browser = c("firefox"))

remDr <- driver[["client"]]
url <- 'https://irelandsgreatwardead.ie/the-archive/'
remDr$navigate(url)

# Locate the next page link
webElem <- remDr$findElement(using = "css", value = "a[data-dt-idx='3'")

# Click that link
webElem$clickElement()

# Get that table
remDr$getPageSource()[[1]] %>% 
  read_html() %>%
  html_table()

您的 for 循环需要从值 3 开始(这是第二页!)。在第二页上,它变成 4,等等。但它永远不会超过 5。因为它是“设计”的,所以你会循环 3:5,然后在 5 处每次保持在 5 处。

【讨论】:

以上是关于通过多个页面抓取 Web 表格(缺少某些行)的主要内容,如果未能解决你的问题,请参考以下文章

自动抓取页面生成接口的方法

当 url 保持不变(但给出 ajax 响应)时,Web 抓取多个页面

抓取跨越多个页面的大型 pdf 表

爬虫抓取表格中的数据

如何使用python和beautifulsoup4循环抓取网站中多个页面的数据

将给定 URL 中的 HTML 表格抓取到 CSV