使用R的Web Scraping Basketball Reference

时间:2018-02-14 01:51:35

标签: r xml web-scraping rvest rcurl

我有兴趣在basketball-reference.com上提取播放器表格。我已成功提取特定玩家的每场比赛统计表(例如LeBron James,作为示例),这是网页上列出的第一个表。但是,页面上有10多个表,我似乎无法提取。我已经能够以不同的方式将表格放入R中。首先,使用rvest包:

library(rvest)
lebron <- "https://www.basketball-reference.com/players/j/jamesle01.html"
lebron_webpage <- read_html(lebron)
lebron_table <- html_table(lebron_webpage, fill = TRUE)
lebron_pergame <- data.frame(lebron_table)

现在我在勒布朗的职业生涯中有一个很好的数据框架。我也可以使用XML和RCurl包的组合来读取同一个表。

library(RCurl)
library(XML)
lebron_url <- paste0(lebron)
lebron_url <- getURL(lebron_url)
lebron_table <- readHTMLTable(lebron_url, which = 1)

如果我想在页面上的其他表中阅读,则会出现问题。例如,页面上的下一个表是Totals。我已经尝试使用CSS选择器来选择我想要读取的特定表,但我无法让它工作。我也尝试右键单击,检查页面上的元素并复制表的XPath,但我也无法使其工作。我花了很多时间在Google上研究这个问题,但似乎无法找到解决这个问题的任何东西。任何帮助将不胜感激!提前谢谢!

2 个答案:

答案 0 :(得分:0)

以下表格是动态加载的(js)。因此,您有很多可能来提取表格。

使用RSelenium模拟用户导航:

library(rvest)
library(RSelenium)
lebron <- "https://www.basketball-reference.com/players/j/jamesle01.html"
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate(lebron)
lebron_webpage <- read_html(remDr$getPageSource()[[1]])
lebron_table <- html_table(lebron_webpage, fill = TRUE)

for (i in 1:length(lebron_table)) 
assign(paste0("table_",i),data.frame(lebron_table[i]))
#You can rename your table by a title to be more explicit

另一种方法是收集js事务并查看是否可以获得json结果。

希望这会有所帮助

Gottavianoni

答案 1 :(得分:0)

这是从另一个post中得到的部分答复,只是将其转发给其他人,在体育参考网站中,不是第一张表的任何内容都被列为评论表,因此我们必须提取评论,然后提取数据框-在这种情况下,您要输入的是“总计”表。

         toggleRememberMe = value => {
        this.setState({ rememberMe: value })
          if (value === true) {
        //user wants to be remembered.
          this.rememberUser();
        } else {
          this.forgetUser();
        }
      }




  // function to save username
      rememberUser = async () => {
        try {
          await AsyncStorage.setItem('user_userID', this.state.signInEmail);
        } catch (error) {
          console.log(error)
        }
        };

// function to get username
        getRememberedUser = async () => {
          try {
            const username = await AsyncStorage.getItem('user_userID');
            if (username !== null) {
              return username;
            }
          } catch (error) {
            console.log(error)
          }
          };




  // function to forget username or remove
          forgetUser = async () => {
            try {
              await AsyncStorage.removeItem('user_userID');
            } catch (error) {
             console.log(error)
            }
          };



 // componentDidMount


 async componentDidMount() {
        const username = await this.getRememberedUser();
        console.log(username)
        this.setState({ 
          signInEmail: username || "", 
           rememberMe: username ? true : false });
        }



 //render

      <Switch
                 trackColor={{true: '#16752A'}}
                  value={this.state.rememberMe}
                  onValueChange={(value) => this.toggleRememberMe(value)}
                />
              <Text>Remember Me</Text>