perl - WWW:机械化表格选择

标签 perl youtube screen-scraping perl-module www-mechanize

我尝试使用WWW:Mechanize登录到Youtube,并在登录后使用Forms()在页面上打印出所有表单。我的脚本成功登录,并且还成功导航至Youtube.com/inbox;但是,由于某些原因,Mechanize在Youtube.com/inbox上看不到任何表格。它只是返回空白。这是我的代码:

#!"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());

Mechanize无法在youtube.com/inbox上看到任何表格,但是,就像我说的那样,无论我将其更改为什么,我都可以从初始链接中打印所有表格。

提前致谢。

最佳答案

与往常一样,最好的调试方法之一是print获得的内容,并检查它是否符合您的期望。这也适用于您的问题。

对于您的情况,如果您使用print $mechanize->content(),则会看到您没有获得期望的页面。 YouTube希望您遵循JavaScript重定向,以完成跨域登录操作。您在这里有多种选择:

  • 手动解析返回的内容–即/location\.replace\("(.+?)"/
  • 尝试让您的代码解析JavaScript(看看WWW::Scripter)
  • [推荐]使用YouTube API管理收件箱
  • 关于perl - WWW:机械化表格选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893625/

    相关文章:

    perl - Perl 中的 Google 身份验证器实现

    javascript - 自动播放下一个声音云

    javascript - 如何在嵌入的 YouTube 视频播放完毕后取消隐藏 <div>

    c# - 屏幕抓取 : unable to authenticate into a site utilizing ASP . NET Forms 身份验证

    html - 使用 CSS 进行布局和格式化的屏幕抓取页面...如何抓取适用于 html 的 CSS?

    linux - 如何使用 sed/awk/perl 从特定列中删除 n 个字符

    perl - 使用Perl调试器与像Devel::REPL这样的真正REPL有什么缺点?

    javascript - 使用 javascript 获取嵌入视频的 URL

    python - 如何使用正则表达式提取子字符串? (屏幕抓取)

    perl - 引用 Perl 运算符