将estest或RSelenium用于草稿表

问题描述 投票:2回答:2

目标:使用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)

任何帮助或指导将不胜感激。谢谢!

r json web-scraping rvest rselenium
2个回答
3
投票

您可以在不使用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)

0
投票

时间短,所以只需要指向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
© www.soinside.com 2019 - 2024. All rights reserved.