2017-06-14 92 views
0

我是新来的网络抓取,目前我正在尝试为一个研究项目下载超过10万部电影的字幕文件。每部电影都有独特的IMDb ID(即,初始识别码为1375666)。我在R中有一个包含102524 ID的列表,我想从opensubtitles.org下载相应的字幕。网页截图来自opensubtitles.org在R

每部电影有网站自己的页面,例如,成立至今:

https://www.opensubtitles.org/en/search/sublanguageid-eng/imdbid-1375666

下载通过点击表格中的第一个环节叫“电影名字上获得的字幕链接“,它会将您带到新页面,然后单击该页面上的”下载按钮“。

我使用rvest刮网页,我已经写了这个代码:

for(i in 1:102524) { 
    subtitle.url = paste0("https://www.opensubtitles.org/en/search/sublanguageid-eng/imdbid-", movie.ids[i]) 

    read_html(subtitle.url) %>% 
    html_nodes(".head+ .expandable .bnone") 
    # Not sure where to go from here 
} 

如何做到这一点任何帮助将不胜感激。

编辑:我知道我问的东西很复杂,但是从哪里开始的任何指针都会很棒。

+0

代码是否会暂停而不会超载该网站?你甚至读过http://trac.opensubtitles.org/projects/opensubtitles/wiki/DevReadFirst(就像它在网站上说的那样)? – hrbrmstr

+0

@hrbrmstr,请参阅下面的答案,其中执行时间延迟。 (当我想出如何去做我正在尝试做的事情时,我会添加一段时间的延迟)。 –

+0

GGamba是一个体面的章(注意我的评论)。你的第二个问题暗示你的设计故意规避你认为你有权获得的B/C网站限制。我不会对我对你的承诺的信念做任何假设或评论,因为这会增加你最终项目的延迟。 – hrbrmstr

回答

2

按照链接和下载按钮,我们可以看到实际的字幕文件从https://www.opensubtitles.org/en/download/vrf-108d030f/sub/6961922下载(例如)。我发现这个检查在下载时在Mozilla的Developer Tools中的Network标签。

我们可以使用该地址直接下载:

download.file('https://www.opensubtitles.org/en/download/vrf-108d030f/sub/6961922', 
       destfile = 'subtitle-6961922.zip') 

据我所看到的基本URL(https://www.opensubtitles.org/en/download/vrf-108d030f/sub/)固定所有下载的,所以我们只需要在网站的ID。

的ID是搜索页面做的内发现的:

id <- read_html(subtitle.url) %>% 
    html_node('.bnone') %>% 
    html_attr('href') %>% 
    stringr::str_extract('\\d+') 

所以,把他们放在一起:

search_url <- 'https://www.opensubtitles.org/en/search/sublanguageid-eng/imdbid-' 
download_url <- 'https://www.opensubtitles.org/en/download/vrf-108d030f/sub/' 

for(i in 1:102524) { 
    subtitle.url = paste0(search_url, movie.ids[i]) 

    id <- read_html(subtitle.url) %>% 
     html_node('.bnone') %>% 
     html_attr('href') %>% 
     stringr::str_extract('\\d+') 

    download.file(paste0(download_url, id), 
        destfile = paste0('subtitle-', movie.ids[i], '.zip')) 

    # Wait somwhere between 1 and 4 second before next download 
    # as courtesy to the site 
    Sys.sleep(runif(1, 1, 4)) 
} 

请记住,这将需要很长的时间!

+0

太棒了!谢谢:) –

+0

wld upvote更多的单独暂停延迟。 – hrbrmstr