【问题标题】:R - help me to scrape links from webpageR - 帮我从网页上抓取链接
【发布时间】:2019-07-12 14:13:54
【问题描述】:

我正在从 IMDB 电影列表中抓取数据。 我想抓取每部电影的链接,但无法正确识别它在页面上的存储位置。

这是链接部分的存储方式: link screenshot

我尝试过的:

link<-html_nodes(strona_int, '.lister-item-header+ a href')
link<-html_text(link)

完整代码

install.packages("rvest")
install.packages("RSelenium")
library(rvest)
library(RSelenium)

#open webprowser (in my case Firefox, but can be chrome or internet explorer)
rD <- rsDriver(browser=c("firefox"))
remDr <- rD[["client"]]

#set the start number for page link
ile<-seq(from=1, by=250, length.out = 1)

#empty frame for data
filmy_df=data.frame()

#loop reading the data
for (j in ile){
  #set the link for webpage
  newURL<-"https://www.imdb.com/search/title/?title_type=feature&release_date=,2018-12-31&count=250&start="
  startNumberURL<-paste0(newURL,j)

#open webpage
remDr$navigate(startNumberURL)

#read html code of the page
strona_int<-read_html(startNumberURL)

#rank section
rank_data<-html_nodes(strona_int,'.text-primary')
#konwersja rankingu na text
rank_data<-html_text(rank_data)
#konwersja na numeric
rank_data<-as.numeric(rank_data)

link<-html_nodes(strona_int, '.lister-item-header+ a href')
link<-html_text(link)

#release date
year<-html_nodes(strona_int,'.lister-item-year')
#konwersja na text
year<-html_text(year)
#usuniecie non numeric
year<-gsub("\\D","",year)
#ustawienie jako factor
year<-as.factor(year)

#title
title_data<-html_nodes(strona_int,'.lister-item-header a')
#konwersja tytulu na text
title_data<-html_text(title_data)

#temporary data frame
filmy_df_temp<-data.frame(Rank=rank_data,Title=title_data,Release.Year=year)

#temp df to target df
filmy_df<-rbind(filmy_df,filmy_df_temp)
}

#close browser
remDr$close()
#stop Selenium
rD[["server"]]$stop()

预期的解决方案: 每部电影的抓取链接,如果需要,以后可以使用。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    收集链接不需要 Selenium。

    链接是a 标签,位于类lister-item-header 的父级中。您可以匹配那些然后提取href 属性。需要添加“https://www.imdb.com”的协议和域

    在css选择器中:

    .lister-item-header a
    

    点是父类的class selector;之间的空格是descendant combinator;最后的atype selectora 标签。

    library(rvest)
    library(magrittr)
    
    url <- "https://www.imdb.com/search/title/?title_type=feature&release_date=,2018-12-31&count=250&start="
    links <- read_html(url) %>% html_nodes(., ".lister-item-header a") %>% html_attr(., "href")
    

    添加协议和域的一种方式:

    library(rvest)
    library(magrittr)
    library(xml2)
    
    base <- 'https://www.imdb.com'
    url <- "https://www.imdb.com/search/title/?title_type=feature&release_date=,2018-12-31&count=250&start="
    links <- url_absolute(read_html(url) %>% html_nodes(., ".lister-item-header a") %>% html_attr(., "href"), base)
    

    参考:

    1. https://www.rdocumentation.org/packages/xml2/versions/1.2.0/topics/url_absolute
    2. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors

    【讨论】:

    • 需要 Selenium 才能打开下一页。 rvest 将抓取内容,但我正在抓取多个页面。
    • ok :-)... 但您的问题是如何获取所有链接 - 这就是上述内容。
    • 太棒了!作品。感谢您提醒我,我可以使用其他级别来废弃数据。附加问题:我可以将其转换为什么,或者可以将其存储为属性?正如您在代码中看到的,我将其余部分转换为文本或数字,但对于 arrtibute 存在错误。
    • 按原样运行我的代码,你会得到所有链接的字符向量
    • 我是新来的,但据我所知,我不能接受评论作为答案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2023-03-26
    • 2020-08-08
    • 2019-07-25
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多