2016-07-11 19 views
0

Ich möchte alle Namen der Benutzer, die unter einem YouTube-Video kommentiert haben kratzen. Ich benutze Ruby und Nokogiri.Web Scraping von youtube mit Nokogiri

Aber es funktioniert nicht, ich bekomme keine Ausgabe, auch kein Fehler.

+1

Wenn Sie keine Ausgabe oder einen Fehler erhalten, sollten Sie bestätigen, dass Sie tatsächlich den von Ihnen erwarteten HTML-Code erhalten. Schalten Sie Javascript in Ihrem Browser aus und schauen Sie sich diese Seite an. Siehst du den gewünschten Inhalt? Verwenden Sie 'nokogiri 'https: //www.youtube.com/watch? V = tntOCGkgt98'' in der Befehlszeile und sehen Sie sich um, oder verwenden Sie' curl' oder 'wget', um die Seite herunterzuladen. Wenn Sie es nicht finden können, sind die Chancen gut, es ist dynamisches HTML und die gewünschten Informationen sind nicht verfügbar, es sei denn, Sie verwenden etwas, das DHTML interpretieren kann. –

+0

nicht wirklich Ihre Frage beantworten, aber was ist mit API dafür? – nikkypx

Antwort

0

Ich glaube, Sie brauchen name.css("#comment-section..."

Die jede Aussage über die Elemente iteriert wird, mit der Variable name.

Möglicherweise möchten Sie node statt Namen verwenden:

doc.css(".comment-thread-renderer > .comment-renderer").each do |node| 
    name = node.css("#comment-section-renderer-items .g-hovercard").text 

    puts name 
end 
+0

Funktioniert auch nicht. (aktualisierter Code) – Max

+0

Eigentlich ist 'Kommentar' besser als' Knoten'. Ich würde versuchen, 'setzt Kommentar '. –

1

ich nicht in der Lage sein, Ihnen eine Lösung zu geben, aber zumindest kann ich Ihnen ein paar Hinweise geben, die Ihnen helfen können bewegen nach vorne.

Der Code, den Sie haben, funktioniert nicht, da der Kommentarbereich über einen Ajax-Aufruf geladen wird, nachdem die Seite geladen wurde. Wenn Sie in Ihrem Browser einen Hard Reload durchführen, sehen Sie, dass in den Kommentaren der Abschnitte ein Spinner-Symbol und ein Loading... Text vorhanden ist, der darauf wartet, dass der Inhalt geladen wird. Wenn Nokogiri die Seite über die http Anfrage erhält, erhält es den HTML-Inhalt, den Sie sehen, bevor die Kommentare geladen werden. Wie in der Tat der Ort, wo der Inhalt wird später sieht aus wie hinzugefügt:

<div id="watch-discussion" class="branded-page-box yt-card"> 
    <div id="comment-section-renderer" 
    class="comment-section-renderer vve-check" 
    data-visibility-tracking="CCsQuy8iEwjr3P3u1uzNAhXIepAKHRV9D8Ao-B0="> 
     <div class="action-panel-loading"> 
     <p class="yt-spinner "> 
      <span class="yt-spinner-img yt-sprite" title="Loading icon"> 
      </span> 
      <span class="yt-spinner-message">Loading...</span> 
     </p> 
     </div> 
    </div> 
</div> 

Das ist der Grund, warum Sie das nicht finden div s Sie suchen, weil sie nicht Teil der sind html hast du.

Wenn Sie die Netzwerkkonsole im Browser betrachten, scheint die Ajax-Anforderung zum Abrufen der Kommentardaten an https://www.youtube.com/watch_fragments_ajax?v=tntOCGkgt98&tr=time&distiller=1&ctoken=EhYSC3RudE9DR2tndDk4wAEAyAEA4AEBGAY%253D&frags=comments&spf=load gesendet zu werden. Wie Sie die v Parameter sehen kann das Video-ID ist, aber es gibt ein paar Einschränkungen:

  • Es gibt einen ctoken param, die Sie durch Abkratzen der ursprünglichen Seiteninhalte zu bekommen. Es ist innerhalb eines <script> Tags in Form von .
  • Sie müssen jedoch immer noch eine session_token als Formulardaten im Körper der AJAX-Anfrage senden (das ist eine POST). Das weiß ich nicht, wo herkommt :(.

Ich denke, dass Sie die Grenzen der Nokogiri hier wird darauf drängen, wie AFAIK nicht beabsichtigt ist, AJAX-Anfragen oder beim Umgang mit Javascript zu folgen. Vielleicht the ruby Selenium driver ist besser geeignet für diesen.

HTH

0

ich schrieb this Schienen App nokogiri mit all Tags, um zu sehen, dass eine Seite hat, bevor eine Javascript im Browser ausgeführt wird. der Quellcode ist here, so dass Sie es anpassen können, wenn Sie müssen weitere Informationen zum Knoten in der Ansicht hinzufügen

Das kann Ihnen leicht sagen, ob das bestimmte Tag-Element, das Sie suchen, etwas ist, das Sie abrufen können, ohne JS eval machen zu müssen.

Die meisten Web-Crawler unterstützen kein clientseitiges Rendering, was Ihnen die Idee gibt, dass es keine triviale Aufgabe ist, JS beim Scraping von Inhalten auszuführen.

+0

Wenn möglich, sollten die Antworten * nicht * auf externe Links angewiesen sein und alle relevanten Codes in der Antwort selbst enthalten. –

+0

Dies beantwortet nicht die implizite Frage des OP: "Was mache ich falsch? Wo ist mein Fehler? "Ihnen zu sagen, wie * Sie * es getan haben, ist kaum hilfreich. –