2017-06-14 88 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