2017-11-07 1 views
0

Da ist es möglich, eine Kopie Ihres Facebook-Datenarchivs herunterzuladen, und es bietet HTML-Dateien von jedem einzelnen Chat, den Sie haben. Ich würde gerne in der Lage sein, das in einen Datenrahmen für die weitere Analyse zu bringen.Scraping Facebook Nachrichten von HTML-Dateien mit RWE

Ein Beispiel für eine der Dateien wie folgt aussieht:

und ich habe ein Beispiel für die HTML-Datei hier hochgeladen: https://gist.githubusercontent.com/eldenvo/182efcd870f74d715b202f3ccdae335e/raw/1b53610459790489efb43ab6caa0f15103d391a1/facebook-message.html

Mein Ideal wäre es, die Daten in einen Datenrahmen zu bekommen, die Spalten: Absender, Nachricht, Zeit.

So

library(rvest) 

doc <- "https://gist.githubusercontent.com/eldenvo/182efcd870f74d715b202f3ccdae335e/raw/1b53610459790489efb43ab6caa0f15103d391a1/facebook-message.html" 
doc %>% read_html() 

kehrt

#> {xml_document} 
#> <html> 
#> [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<base href="../">\n<style type="text/c ... 
#> [2] <body>\n<a href="html/messages.htm">Back</a><br><br><div class="thread">Conversation with p1, p2<div class="message .. 

Und mit dem Auswahlwerkzeug in Chrome, etwas zu versuchen und extrahieren mit mehr:

doc %>% read_html() %>% html_node(xpath = '/html/body/div/div[1]') 
#> {xml_node} 
#> <div class="message"> 
#> [1] <div class="message_header">\n<span class="user">p1</span><span class="meta">Monday, 19 March 2012 at 23:29 UTC</sp ... 

oder

doc %>% read_html() %>% html_node(xpath = '/html/body/div/p/text()') %>% html_text() 

#> [1] "I didn't see your message before, i'm sorry that i didn't answer. Next time i promise !!" 

Ich bin nicht sehr vertraut mit html oder rvest so bin ich mir nicht sicher über den besten Weg, um die vollständige Liste der Nachrichten und zugehörigen Informationen in eine data.frame zu extrahieren. https://blog.rstudio.com/2014/11/24/rvest-easy-web-scraping-with-r/

Vor allem der Hinweis für http://selectorgadget.com, das macht es zu extrahieren viel einfacher zu entsprechenden Tags zu finden.

Antwort

0

Dieser Artikel kann Ihnen helfen, eine Menge

Ihr aktuelles Beispiel würde wie folgt funktionieren:

library(tidyverse) 
library(rvest) 

doc <- "https://gist.githubusercontent.com/eldenvo/182efcd870f74d715b202f3ccdae335e/raw/1b53610459790489efb43ab6caa0f15103d391a1/facebook-message.html" 

pg <- doc %>% read_html() 

Wir haben einen kleinen Helfer schaffen ein paar Mal wiederverwenden:

extract_nodes <- function(pg, css) { 
    pg %>% 
    html_nodes(css) %>% 
    html_text() 
} 

Als nächstes extrahieren wir den entsprechenden Teil über die Datum. Danach müssen wir das Datum verarbeiten und analysieren. Ich entferne den Anfang des Strings "Monday, ....", danach müssen nur noch die korrekten Parameter für parse_datetime eingestellt werden, die in der Hilfe-Datei zu finden sind.

dates <- pg %>% 
    extract_nodes("span[class='meta']") %>% 
    str_replace("^.*,\\s", "") %>% 
    parse_datetime(format = "%d %B %Y %* %H:%M %*") 

Sobald die Daten abgerechnet werden, können wir leicht auf Nachrichten Benutzer analysieren:

result <- data_frame(
    user = extract_nodes(pg, "span[class='user']"), 
    dates = dates, 
    message = extract_nodes(pg, "p") 

) 
result 
#> # A tibble: 4 x 3 
#> user    dates 
#> <chr>    <dttm> 
#> 1 p1 2012-03-19 23:29:00 
#> 2 p2 2012-03-19 15:39:00 
#> 3 p1 2012-03-19 08:34:00 
#> 4 p1 2012-03-18 20:24:00 
#> # ... with 1 more variables: message <chr> 
Verwandte Themen