我正在尝试从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)
结果相同。 您能帮我解决这个问题吗?
谢谢
答案 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)
您将被重定向回,因为该网站正在检查您发送的标头。为了获取正确的数据,您需要设置以下标头:
Accept
:text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
X-Requested-With
:XMLHttpRequest
此外,此请求不会返回网页的HTML,而是返回jQuery代码,从而动态更新网站上的列表。