抓取时,第2页中的数据与第1页中的数据相同

时间:2019-08-21 08:23:50

标签: html r web-scraping rvest

我正在尝试从https://www.tapology.com/fightcenter抓取所有事件链接。 在使用R进行网络抓取方面已经有相当的经验,但是在这种情况下,我陷入了困境。

我可以从第1页抓取,但是当我输入第二页作为URL时,我仍然从第一页获取数据,就像该页面被自动重定向回一样。

我尝试了在论坛上找到的各种代码,但是还是有问题。

首页

  url = "https://www.tapology.com/fightcenter"

    html <- paste(readLines(url), collapse="\n")
    library(stringr)
    matched <- str_match_all(html, "<a href=\"(.*?)\"")
    matched = as.data.frame(matched[[1]], stringsAsFactors = F)

第二页

  url = 'https://www.tapology.com/fightcenter_events?page=2'
  html <- paste(readLines(url), collapse="\n")
  library(stringr)
  matched <- str_match_all(html, "<a href=\"(.*?)\"")

  matched = as.data.frame(matched[[1]], stringsAsFactors = F)

结果相同。 您能帮我解决这个问题吗?

谢谢

2 个答案:

答案 0 :(得分:1)

内容是通过xhr动态添加的。您可以使用httr(如其他答案中所述)并添加标题。您还需要在循环/序列期间更改URL中的页面参数。下面显示了一个示例,其中显示了对不同页面的单个请求(我只是提取人1与人2的战斗链接以显示它正在从该页面读取)。您可以将其更改为返回循环中感兴趣的信息的函数,或者使用purrr将信息映射到现有结构。

require(httr)
require(rvest)
require(magrittr)
require(stringr)

headers = c(
  'User-Agent' = 'Mozilla/5.0',
  'Accept' = 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
  'X-Requested-With' = 'XMLHttpRequest'
)

params = list(
  'page' = '2'
)

r <- httr::GET(url = 'https://www.tapology.com/fightcenter_events', httr::add_headers(.headers=headers), query = params)
x <- str_match_all(content(r,as="text") ,'html\\("(.*>)')
y <- gsub('"',"'",gsub('\\\\','', x[[1]][,2]))
z <- read_html(y) %>% html_nodes(., ".billing a") %>% html_attr(., "href")

答案 1 :(得分:0)

您将被重定向回,因为该网站正在检查您发送的标头。为了获取正确的数据,您需要设置以下标头:

  • Accepttext/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
  • X-Requested-WithXMLHttpRequest

此外,此请求不会返回网页的HTML,而是返回jQuery代码,从而动态更新网站上的列表。