2017-01-17 4 views
0

это Джо из Национального университета Тайбэя, Тайвань. В настоящее время я занимаюсь исследованиями в онлайн-играх и E-спорте путем интеллектуального анализа текста в социальных сетях. Я решил получить данные из самых популярных BBS, «PTT», на Тайване, но, похоже, мой код может захватывать только заголовки статей, но не может достичь содержимого.Используйте R, чтобы сделать веб-сканер, и он не может захватить контент, который мне нужен (текстовый поиск) (тайваньская BBS, ptt)

Я попытался получить тексты от www.ptt.cc/bbs/LoL/index6402.html до index6391, а код, который я использовал, находится здесь в my R code data или R code txt file или ниже.

install.packages("httr") 
install.packages("XML") 
install.packages("RCurl") 
install.packages("xml2") 

library(httr) 
library(XML) 
library(RCurl) 
library(xml2) 


data <- list() 

for(i in 6391:6402) { 
    tmp <- paste(i, '.html', sep='') 
    url <- paste('https://www.ptt.cc/bbs/LoL/index', tmp, sep='') 
    tmp <- read_html(url) 
    html <- htmlParse(getURL(url)) 
    url.list <- xml_find_all(tmp, "//div[@class='title']/a[@href]") 
    data <- rbind(data, as.matrix(paste('https://www.ptt.cc', url.list, sep=''))) 
} 
data <- unlist(data) 

getdoc <- function(line){ 
    start <- regexpr('https://www', line)[1] 
    end <- regexpr('html', line)[1] 

    if(start != -1 & end != -1){ 
    url <- substr(line, start, end+3) 
    html <- htmlParse(getURL(url), encoding='UTF-8') 
    doc <- xpathSApply(html, "//div[@id='main-content']", xmlValue) 
    name <- strsplit(url, '/')[[1]][4] 
    write(doc, gsub('html', 'txt', name)) 
    }  
} 
setwd("E:/data") 
sapply(data, getdoc) 

Но этот код может захватывать только заголовки, а мои txt-файлы пустые. Я не уверен, какая часть идет не так, и поэтому мне нужен совет от stackoverflow.

Любой совет будет очень благодарен, и любой, кто поможет мне в этом, будет включен в список подтверждений в моей диссертации, и, если вам интересно, я сообщу вам результат исследования после его завершения , :)

+0

добро пожаловать в SO. вам нужно опубликовать минимальный воспроизводимый пример, который иллюстрирует то, что вы пытаетесь сделать, и почему он не работает. ссылка на код на Dropbox (и др.) является отрывочной и затрудняет изучение другими пользователями решений на этом сайте. – hrbrmstr

+0

Я так новичок, спасибо за совет, я его модифицирую. –

ответ

1

Что-то вроде:

library(tidyverse) 
library(rvest) 

# change the end number 
pages <- map(6391:6392, ~read_html(sprintf("https://www.ptt.cc/bbs/LoL/index%d.html", .))) 

map(pages, ~xml_find_all(., "//div[@class='title']/a[@href]")) %>% 
    map(xml_attr, "href") %>% 
    flatten_chr() %>% 
    map_df(function(x) { 
    URL <- sprintf("https://www.ptt.cc%s", x) 
    pg <- read_html(URL) 
    data_frame(
     url=URL, 
     text=html_nodes(pg, xpath="//div[@id='main-content']") %>% html_text() 
    ) 
    }) -> df 

glimpse(df) 
## Observations: 40 
## Variables: 2 
## $ url <chr> "https://www.ptt.cc/bbs/LoL/M.1481947445.A.17B.html", "https://www.ptt.cc/b... 
## $ text <chr> "作者rainnawind看板LoL標題[公告] LoL 板 開始舉辦樂透!時間Sat Dec 17 12:04:03 2016\nIMT KDM 勝... 

, чтобы сделать кадр данных или Суб из последней части с:

dir.create("pttdocs") 

map(pages, ~xml_find_all(., "//div[@class='title']/a[@href]")) %>% 
    map(xml_attr, "href") %>% 
    flatten_chr() %>% 
    walk(function(x) { 

    URL <- sprintf("https://www.ptt.cc%s", x) 

    basename(x) %>% 
     tools::file_path_sans_ext() %>% 
     sprintf(fmt="%s.txt") %>% 
     file.path("pttdocs", .) -> fil 

    pg <- read_html(URL) 

    html_nodes(pg, xpath="//div[@id='main-content']") %>% 
     html_text() %>% 
     writeLines(fil) 

    }) 

для записи файлов в каталог.

+0

Я очень благодарен за ваш ответ –

+0

Я пробую write.table (df, "filename.txt", sep = "\ t", row.names = FALSE) , но я хочу сохранить каждый контент .... –

+0

спасибо за вашу помощь, я решил свою проблему !! –