2012-03-14 13 views
6

Revised (wyjaśniona kwestia)trzeba zeskrobać dane z gry facebook - używając rubin

Spędziłem kilka dni już próbuje dowiedzieć się, jak do skrobania konkretne informacje z gry facebook; jednak po ceglanej ścianie natknąłem się na mur. Jak najlepiej mogę powiedzieć, główny problem jest następujący. Mogę użyć narzędzia do sprawdzania elementów przeglądarki Chrome, aby ręcznie znaleźć potrzebny html - jest on umieszczony wewnątrz elementu iframe. Jednak, gdy próbuję i zeskrobać że iframe jest pusty (z wyjątkiem nieruchomości):

<iframe id="game_frame" name="game_frame" src="" scrolling="no" ...></iframe> 

To samo wyjście, które widzę w przypadku korzystania z przeglądarek narzędzie „Pokaż źródło strony”. Nie rozumiem, dlaczego nie widzę danych w elemencie iframe. Odpowiedź NIE jest taka, że ​​jest ona później dodawana przez AJAX. (Wiem, że zarówno dlatego, że "View page source" może czytać dane, które zostały dodane przez Ajax, a także dlatego, że mam b/c czekałem, dopóki nie zobaczę strony danych przed jej zeskanowaniem i nadal jej tam nie ma).

Czy dzieje się tak z powodu skrobania na ekranie przez facebooka, a jeśli tak, to w jaki sposób? Czy po prostu coś mi brakuje. Programuję w rubinie i próbowałem nokogiri, potem zmechanizowałem, a następnie kapibara bez powodzenia.

Nie wiem, czy to robi jakąkolwiek różnicę, ale wydaje mi się, że element iframe pobiera dane za pomocą odnośnika "game_frame" elementu iframe, który najwyraźniej odnosi się do tego fragmentu html, który pojawia się wcześniej w dokumencie:

<form id="hidden_login_form_1331840407" action="" method="POST" target="game_frame"> 
    <input type="hidden" name="signed_request" autocomplete="off" value="v6kIAsKTZa..."> 
    ... 
</form> 

pytanie Original

napisałem program, który korzysta z rubinem nokogiri zeskrobać danych z HTML Facebooku gry. Obecnie otrzymuję kod HTML za pomocą narzędzia "inspect element" narzędzia chrome i zapisuję go w pliku i tam go parsuję. Jednak naprawdę chciałbym móc uzyskać dostęp do informacji z ruby. Na przykład chciałbym przekazać programowi nazwę strony "www.gamename.com/...?id=12345" i zalogować się na facebooku, przejść do tej strony i zeskrobać dane. Obecnie, jeśli próbuję tego, to nie działa, ponieważ jestem przekierowywany na stronę logowania na Facebooku. Jak przejść przez ekran logowania, aby uzyskać dostęp do stron, których potrzebuję?

Chciałbym to zrobić za pomocą kodu nokogiri, który już napisałem; jednak, jeśli będę musiał, mogę przepisać go za pomocą czegoś innego. Obecnie program jest samodzielnym programem - nie programem szyn - ale mogę to zmienić. Widzę pewne informacje, które mogą wskazać mi kierunek Omniauth, ale nie jestem pewien, czego właśnie szukam, a także wygląda to bardzo skomplikowanie. Mam nadzieję, że istnieje prostsze rozwiązanie.

Dzięki

Odpowiedz

6

mogę polecić capybara-webkit dla tego rodzaju zadania. Wykorzystuje QtWebKit pod maską i rozumie Javascript:

require 'capybara-webkit' 
require 'capybara/dsl' 
require 'nokogiri' 

include Capybara::DSL 
Capybara.current_driver = :webkit 

# login 
visit("https://www.facebook.com") 
find("#email").set("user") 
find("#pass").set("password") 
find("#loginbutton//input").click 

# navigate to the JS-generated page 
visit("www.gamename.com/...?id=12345") 

# parse HTML 
doc = Nokogiri::HTML.parse(body) 
+0

Chociaż nie mogłem dostać WebKit do pracy b/c problemów budowlanych okna gem, byłem w stanie użyć Capybary, aby uzyskać potrzebne informacje. Największą wadą było to, że ponieważ potrzebne informacje były zawarte w ramce, nie pojawiły się w kodzie HTML strony głównej. Jednak w końcu zdałem sobie sprawę, że jeśli użyłbym metody within_frame, byłbym w stanie uzyskać dostęp do informacji w ramce i to zadziałało. –

4

Najłatwiej jest użyć mechanize:

require 'mechanize' 
@agent = Mechanize.new{|a| a.user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'} 
page = @agent.get 'http://www.facebook.com/' 
form = page.forms[0] 
form['email'], form['pass'] = '[email protected]', 'foobar' 
form.submit 
# now you're logged in and a request like this: 
doc = @agent.get('http://www.facebook.com/').parser 
# gives you a logged in Nokogiri::HTML::Document like you're used to 
+0

Użyłem RestClient do zrobienia czegoś podobnego, aczkolwiek musisz zarządzać ciasteczkami, przekierowaniami itp. W RestClient. Mechanize wygląda jak dobry kandydat, aby ułatwić te zadania. – ch4nd4n

+0

w zależności od aplikacji, brak obsługi JavaScript może być showstopper. –

+0

Próbowałem tego i wygląda na to, że doskonale się nadaje do logowania. Dzięki. Jednak wydaje się, że nie rozwiązuje on mojego konkretnego problemu. Informacje, których szukam, znajdują się w ukrytej formie, której Nokogiri nie czyta. Nawet standardowa przeglądarka sieciowa "zobacz źródło" nie widzi treści ukrytej formy, a jedynie ukryty formularz. Nokogiri tego nawet nie widzi. Wygląda na to, że tylko narzędzie do sprawdzania elementów przeglądarki Chrome może zobaczyć te informacje. Nie wiem wystarczająco dużo, aby zrozumieć, co to znaczy i jak sobie z tym poradzić. –

Powiązane problemy