使用Rvest收集排名

时间:2019-06-05 05:40:10

标签: r web-scraping rvest

我想从以下网站抓取所有排名:

https://www.glassdoor.com/ratingsDetails/full.htm?employerId=432&employerName=McDonalds#trends-overallRating

我尝试使用CSS选择器,该选择器告诉我使用“ .ratingNum”,但是它留下空白数据。我也尝试过使用GET函数,这会导致类似的问题。

# Attempt 1
url <- 'https://www.glassdoor.com/ratingsDetails/full.htm?employerId=432&employerName=McDonalds#trends-overallRating'

webpage <- read_html(url)

rank_data_html <- html_nodes(webpage,'.rankingNum')

rank_data <- html_table(rank_data_html)

head(rank_data)

# Attempt 2
res <- GET("https://www.glassdoor.com/ratingsDetails/full.htm",
       query=list(employerId="432",
                  employerName="McDonalds"))

doc <- read_html(content(res, as="text"))

html_nodes(doc, ".ratingNum")

rank_data <- html_table(rank_data_html)

head(rank_data)

我希望结果能给我所有排名的列表,但是却给了我一个空列表,或者一个不包含排名的列表。

1 个答案:

答案 0 :(得分:1)

您的列表为空,因为您GET正在填充未填充的HTML文档。通常,发生这种情况时,您必须求助于RSelenium和co。,但是Glassdoor的面向公众的API实际上具有所需的一切-如果您知道在哪里看。

(注意:我不确定这是否正式属于Glassdoor的公共API,但我认为如果他们不加掩饰,那就是公平的游戏。我尝试查找一些信息,但他们的文档却很少。通常,如果您只是做一些小规模的分析,而不是猛烈抨击服务器或试图从数据中获利,公司通常会选择另一种方式,但是留意他们的服务条款仍然是一个好主意。想要向他们发送一封描述您正在做的事情的电子邮件,甚至询问是否成为API合作伙伴。请确保您遵守他们的attribution rules。继续后果自负。)

在浏览器的开发人员工具中查看“网络分析”标签。您将看到一些GET请求返回JSON,其中一个具有您所需的地址。发送GET并解析JSON:

library(httr)
library(purrr)
library(dplyr)

ratings <- paste0("https://www.glassdoor.com/api/employer/432-rating.htm?",
                  "locationStr=&jobTitleStr=&filterCurrentEmployee=false")

req_obj <- GET(ratings)
cont <- content(req_obj)

ratings_df <- map(cont$ratings, bind_cols) %>% bind_rows()

ratings_df

您应该最终得到一个包含评分数据的数据框。只是不要忘记,“ ceoRating”,“ bizOutlook”和“ recommend”是0-1的比例(如果是* 100,则是百分比),其余部分则以5分制反映平均用户评分:

# A tibble: 9 x 3
  hasRating type                value
  <lgl>     <chr>               <dbl>
1 TRUE      overallRating       3.3  
2 TRUE      ceoRating           0.72 
3 TRUE      bizOutlook          0.42 
4 TRUE      recommend           0.570
5 TRUE      compAndBenefits     2.8  
6 TRUE      cultureAndValues    3.1  
7 TRUE      careerOpportunities 3.2  
8 TRUE      workLife            3.1  
9 TRUE      seniorManagement    2.9