2012-03-14 13 views
6

Revisada (pregunta clarificada)necesito para raspar los datos de un juego de facebook - usando rubí

He pasado unos días ya tratando de encontrar la manera de raspar la información específica de un juego de facebook; sin embargo, me encontré con una pared de ladrillos tras otra. Lo mejor que puedo decir es que el principal problema es el siguiente. Puedo usar la herramienta de elemento de inspección de Chrome para encontrar manualmente el html que necesito, parece anidado dentro de un iframe. Sin embargo, cuando intento y raspar que iframe, que está vacío (a excepción de propiedades):

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

Esta es la misma salida que veo si uso una herramienta de navegadores "Ver fuente de la página". No entiendo por qué no puedo ver los datos en el iframe. La respuesta NO es que sea añadida posteriormente por AJAX. (Lo sé porque "Ver el origen de la página" puede leer datos agregados por Ajax y también porque he b/c He esperado hasta que pueda ver la página de datos antes de rasparla y todavía no está allí).

¿Esto sucede debido al raspado anti pantalla de Facebook, y si es así hay una forma de evitarlo? O solo me estoy perdiendo algo. Programo en ruby ​​y probé nokogiri, luego mecanicé y luego capibara sin éxito.

No sé si hace alguna diferencia, pero me parece que el iframe está obteniendo sus datos usando la referencia "game_frame" del iframe que aparentemente se refiere a esta pieza de html que aparece anteriormente en el documento:

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

pregunta original

me escribió un programa que utiliza el rubí nokogiri para raspar los datos de HTML de un juego de facebook. Actualmente, obtengo el HTML usando la herramienta "inspeccionar elemento" de Chrome y lo guardo en un archivo y lo analizo desde allí. Sin embargo, me gustaría poder acceder a la información desde dentro de ruby. Por ejemplo, le pasaría al programa el nombre de la página "www.gamename.com/...?id=12345" y se ingresaría a Facebook, iría a esa página y borraría los datos. Actualmente, si intento eso, no funciona porque me redirigen a la página de inicio de sesión de Facebook. ¿Cómo puedo pasar la pantalla de inicio de sesión para acceder a la (s) página (s) que necesito?

Me gustaría hacer esto usando el código nokogiri que ya he escrito; sin embargo, si tengo que hacerlo, podría reescribirlo utilizando otra cosa. Actualmente, el programa es un programa independiente, no un programa de rieles, pero podría cambiar eso. He visto información que podría apuntarme en dirección a Omniauth, pero no estoy seguro de que sea eso lo que estoy buscando y también parece muy complicado. Espero que haya una solución más simple.

Gracias

Respuesta

6

puedo recomendar capybara-webkit para este tipo de tarea. Utiliza QtWebKit bajo el capó y entiende 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

Aunque no pude conseguir webkit para trabajar b/c de los problemas de construcción ventanas joya, pude usar Capybara para obtener la información que necesitaba. El punto más importante fue que debido a que la información que necesitaba estaba dentro de un marco, no apareció en el HTML de la página principal. Sin embargo, finalmente me di cuenta de que si utilizaba el método within_frame, podría acceder a la información dentro del marco y esto funcionó. –

4

Lo más fácil es utilizar mecanizar:

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

He utilizado RestClient para hacer algo similar, aunque requiera administrar cookies, redirecciones, etc. en RestClient. mecanizar parece un buen candidato para facilitar estas tareas. – ch4nd4n

+0

dependiendo de la aplicación, el soporte de JavaScript que falta podría ser un inconveniente. –

+0

Intenté esto y parece funcionar muy bien para iniciar sesión. Gracias. Sin embargo, no parece resolver mi problema específico. La información que estoy buscando está dentro de una forma oculta que Nokogiri no lee. Incluso la opción del navegador web "ver fuente" estándar no puede ver el contenido del formulario oculto, solo que hay un formulario oculto. Nokogiri ni siquiera ve eso. Solo la herramienta de elemento de inspección de Chrome parece poder ver la información. No sé lo suficiente como para entender lo que esto significa o cómo lidiar con esto. –

Cuestiones relacionadas