目标:使用R从以下网站抓取表格。
网站: https://evanalytics.com/mlb/models/teams/advanced
[我有什么困扰:我使用rvest来自动化大部分数据收集过程,但是该特定站点似乎超出了rvest的工作范围(或至少超出了我的经验水平)。不幸的是,当页面打开时,它不会立即加载表。我试图通过RSelenium提出解决方案,但未能找到正确的表路径(RSelenium对我来说是全新的)。导航到页面并暂停一小段时间以允许表加载后,下一步是什么?
到目前为止我所拥有的:
library("rvest")
library("RSelenium")
url <- "https://evanalytics.com/mlb/models/teams/advanced"
remDr <- remoteDriver(remoteServerAddr="192.168.99.100", port=4445L)
remDr$open()
remDr$navigate(url)
Sys.sleep(10)
任何帮助或指导将不胜感激。谢谢!
您可以在不使用Selenium的情况下通过创建html_session来做到这一点,以获取所需的php会话ID来传递cookie。您还需要一个用户代理标头。有了会话后,您可以发出POST xhr请求以获取所有数据。您需要一个json解析器来处理响应html中的json内容。
您可以在脚本标记之一中查看params信息:
function executeEnteredQuery() {
var parameterArray = {
mode: 'runTime',
dataTable_id: 77
};
$.post('/admin/model/datatableQuery.php', {
parameter: window.btoa(jQuery.param(parameterArray))
},
function(res) {
processdataTableQueryResults(res);
}, "json");
}
您可以自己为参数编码字符串:
base64_enc('mode=runTime&dataTable_id=77')
R:
require(httr)
require(rvest)
require(magrittr)
require(jsonlite)
headers = c('User-Agent' = 'Mozilla/5.0')
body = list('parameter' = 'bW9kZT1ydW5UaW1lJmRhdGFUYWJsZV9pZD03Nw==') # base64 encoded params for mode=runTime&dataTable_id=77
session <- html_session('https://evanalytics.com/mlb/models/teams/advanced', httr::add_headers(.headers=headers))
p <- session %>% rvest:::request_POST('https://evanalytics.com/admin/model/datatableQuery.php', body = body)%>%
read_html() %>%
html_node('p') %>%
html_text()
data <- jsonlite::fromJSON(p)
df <- data$dataRows$columns
print(df)
Py:
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
body = {'parameter': 'bW9kZT1ydW5UaW1lJmRhdGFUYWJsZV9pZD03Nw=='} # base64 encoded params for mode=runTime&dataTable_id=77
with requests.Session() as s:
r = s.get('https://evanalytics.com/mlb/models/teams/advanced')
r = s.post('https://evanalytics.com/admin/model/datatableQuery.php')
data = r.json()
cols = [th.text for th in bs(data['headerRow'], 'lxml').select('th')]
rows = [[td.text for td in bs(row['dataRow'], 'lxml').select('td')] for row in data['dataRows']]
df = pd.DataFrame(rows, columns = cols)
print(df)
时间短,所以只需要指向html源代码,您就可以使用r背心从中提取表。
remDr$navigate(url)
html <-remDr$getPageSource()
## this will get you html of the page, form here
## just extract the table as you would with rvest