2011-02-04 97 views
1

我試圖用WWW登錄到Youtube:登錄後機械化並使用窗體()打印出頁面上的所有表單。我的腳本正在成功登錄,並且成功導航到Youtube的.com /收件箱;但是,由於某種原因,Mechanize在Youtube.com/inbox上看不到任何表單。它只是返回空白。這裏是我的代碼:WWW:機械化表單選擇

#!"C:\Perl64\bin\perl.exe" -T 

use strict; 
use warnings; 

use CGI; 
use CGI::Carp qw/fatalsToBrowser/; 
use WWW::Mechanize; 
use Data::Dumper; 

my $q = CGI->new; 

$q->header(); 

my $url = 'https://www.google.com/accounts/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http://www.youtube.com/signin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252Findex&hl=en_US&ltmpl=sso'; 

my $mechanize = WWW::Mechanize->new(autocheck => 1); 

$mechanize->agent_alias('Windows Mozilla'); 

$mechanize->get($url); 

$mechanize->submit_form(
     form_id => 'gaia_loginform', 
     fields  => { Email => 'myemail',Passwd => 'mypassword' }, 
    ); 
    die unless ($mechanize->success); 

$url = 'http://www.youtube.com/inbox'; 

$mechanize->get($url); 

$mechanize->form_id('comeposeform'); 

my $page = $mechanize->content(); 

print Dumper($mechanize->forms()); 

機械化是無法看到任何youtube.com/inbox形式,但是,就像我說的,我可以打印所有的形式從最初的環節,不管是什麼我改變以...

在此先感謝。

+2

我沒有Youtube帳戶,所以我無法測試運行您的程序。我想這是JavaScript生成表單的常見問題;當你打印`$ page`時,你不會在HTML中看到它們。如果確實如此,可以使用三個支持JS的機械化類中的一個,或者更好的是,放棄屏幕抓取並使用API​​:請參閱http://youtube.com/dev和[WebService :: GData :: YouTube上(http://p3rl.org/WebService::GData::YouTube)。 – daxim 2011-02-04 09:16:19

回答

2

像往常一樣,最好的調試方法之一是print你得到什麼,並檢查它是否是你所期望的。這也適用於你的問題。

就你而言,如果你print $mechanize->content()你會看到你沒有得到你期望的頁面。 YouTube希望您遵循JavaScript重定向,以完成您的跨域登錄操作。你有多種選擇這裏:

  • 手動解析返回的內容 - 即/location\.replace\("(.+?)"/
  • 嘗試讓你的代碼解析的JavaScript(看看WWW::Scripter
  • [推薦]用YouTube API管理您的收件箱
+0

感謝提示alessandro!唯一的一點是,當我打印內容時,它會像我期望的那樣完全顯示收件箱頁面......它只是看不到頁面上的任何表單。當我打印內容時,它如何顯示正確的收件箱頁面,並且能夠在瀏覽器中正確查看打印內容的來源(當我查看源代碼時),但無法使用www:mechanize查看該源代碼? – nicktendo 2011-02-04 18:57:32