2012-03-14 11 views
6
kullanılarak

Revize (açıklık soru)Bir facebook oyun verileri kazımak gerekir - yakut

Birkaç gün önceden bir facebook oyundan belirli bilgileri kazımak nasıl anlamaya çalışırken geçirdim; Ancak, tuğla duvardan sonra tuğla duvara koştum. Anladığım kadarıyla, asıl sorun şu şekildedir. İhtiyacım olan html'yi manuel olarak bulmak için Chrome'un inceleme aracı aracını kullanabilirim - bir iframe içine yerleştirilmiş gibi görünür. Ben denemek ve bu iframe kazımak Ancak, bu (özellikleri hariç) boş:

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

Buna "Sayfa kaynağını" aracı bir tarayıcı kullanıyorsanız gördüğüm aynı çıkıştır. iframe'deki verileri neden göremiyorum anlamıyorum. Cevap, AJAX tarafından sonradan eklenmesi DEĞİLDİR. (Bunun nedeni, "Sayfa kaynağını görüntüle" Ajax tarafından eklenen verileri okuyabildiğinden ve ayrıca veri sayfasını görebilmemden sonra beklediğimden ve beklemeden beklediğimden beri biliyorum).

Bu durum, facebook'un ekran karşıtı kazıma işleminden kaynaklanıyor mu? Bu durumun bir yolu var mı? Yoksa sadece bir şeyi özlüyorum. Ruby'de programlıyorum ve nokogiri denedim, sonra mekanize ettik, sonra kapibara başarı olmadan.

Herhangi bir fark yaratıp yaratmadığını bilmiyorum, ancak iframe'nin iframe'in "game_frame" referansını kullanarak, bu belgede daha önce görünen bu html parçasını ifade eden bir veriyi kullanıyor olması bana öyle geliyor:

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

Orijinal soru Ben facebook oyunun HTML veri kazımak için Nokogiri kullanan bir yakut program yazdım. Şu anda, HTML'yi "inceleme elemanı" aracını kullanarak aldım ve onu bir dosyaya kaydedip oradan ayrıştırıyorum. Bununla birlikte, ruby'nin içinden bilgiye erişmeyi gerçekten çok isterim. Örneğin, programa "www.gamename.com/...?id=12345" sayfa adını aktarırdım ve facebook'a giriş yapar, o sayfaya gider ve verileri kazıyabilirim. Şu anda, bunu denerseniz, işe yaramıyor çünkü facebook'un giriş sayfasına yönlendiriliyordum. İhtiyacım olan sayfaya (sayfalara) erişmek için giriş ekranını nasıl geçebilirim?

Bunu daha önce yazdığım nokogiri kodunu kullanarak yapmak istiyorum; Ancak, eğer gerekiyorsa başka bir şey kullanarak yeniden yazabilirim. Şu anda, program bağımsız bir program - bir ray programı değil - ama bunu değiştirebilirdim. Beni Omniauth yönünde yönlendirebilecek bazı bilgiler görüyorum ama aradığım şeyden emin değilim ve aynı zamanda çok karmaşık görünüyor. Umarım daha basit bir çözüm vardır.

Teşekkür

cevap

6

Ben görevin bu tür capybara-webkit tavsiye edebilir. Bu başlık altında QtWebKit kullanır ve anlayan 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

ihtiyacım olan bilgiyi almak için Capybara'yı kullanmak. En büyük yapışkan nokta, ihtiyacım olan bilginin bir çerçeve içinde yer alması nedeniyle, ana sayfa için HTML'de görünmemesiydi. Ancak, nihayet, iç çerçeve yöntemini kullanmış olsaydım, çerçevedeki bilgilere erişebildiğimi ve bunun işe yaradığını fark ettim. –

4

en kolay mekanize kullanmaktır: i webkit/windows mücevher yapı sorunlarının c ı başardı b çalışmak için alamadım rağmen

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

RestClient'te benzer bir şey yapmak için RestClient'i kullandım, ancak RestClient'de çerezleri yönetmek, yönlendirmek vb. mekanize etmek bu görevleri kolaylaştırmak için iyi bir aday gibi görünüyor.Uygulamaya bağlı olarak, – ch4nd4n

+0

, eksik JavaScript desteği bir showtopper olabilir. –

+0

Bunu denedim ve giriş yapmak için harika çalışıyor. Teşekkürler. Ancak, benim özel problemimi çözmekte görünmüyor. Aradığım bilgiler, Nokogiri tarafından okunmayan gizli bir formun içinde. Standart "görüntüleme kaynağı" web tarayıcısı seçeneği bile gizli formun içeriğini göremez, sadece gizli bir form vardır. Nokogiri bunu görmüyor bile. Yalnızca Chrome’un inceleme aracı aracı bilgileri görebilir. Bunun ne anlama geldiğini veya bununla nasıl başa çıkacağını anlamak için yeterli bilgim yok. –