使用WWW :: Mechanize刮目录下的多个页面 - Perl
我正在开发一个项目到网站,将每次采访发现here转化为一个HTML准备好的文档,稍后转储到一个DB中,该DB将自动更新我们的网站最新的内容。你可以看到我当前的网站抓取脚本的一个例子,我问了一个有关前一天的问题:WWW::Mechanize Extraction Help - PERL使用WWW :: Mechanize刮目录下的多个页面 - Perl
问题我似乎无法环绕我的头是知道如果我现在想要完成的是甚至可能。因为我不想猜想当一个新的采访发布时,我希望能够抓取具有所有采访目录列表的网站,并自动让我的程序获取新的内容网址(新面试)。
再次,有问题的网站是在这里(向下滚动查看面试上市):在上面的链接的结束,希望http://millercenter.org/president/clinton/oralhistory
我最初的想法是有一个正则表达式\它会自动搜索在该页面下找到的任何链接。但是,我似乎无法使用WWW :: Mechanize获得此功能。我将发布我在下面的内容,如果任何人有任何指导或经验与此,您的反馈将不胜感激。我还会在代码下面总结我的任务,以便您对我们希望完成的任务有一个简明的理解。
感谢任何和所有可以帮助!
#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
use WWW::Mechanize::Link;
use WWW::Mechanize::TreeBuilder;
my $mech = WWW::Mechanize->new();
WWW::Mechanize::TreeBuilder->meta->apply($mech);
$mech->get("http://millercenter.org/president/clinton/oralhistory/\.");
# find all <dl> tags
my @list = $mech->find('dl');
foreach (@list) {
print $_->as_HTML();
}
# # find all links
# my @links = $mech->links();
# foreach my $link (@links) {
# print "$link->url \n";
# }
要总结一下我希望是可能的:
提取每一次采访的内容的HTML准备文档中找到here像我一样在这里:WWW::Mechanize Extraction Help - PERL。这需要'get'操作能够遍历/ oralhistory /目录下列出的页面,这些页面可以使用正则表达式来解决?
可能解压目录页答辩名称和位置字段标题字段中填充(这不是什么大不了的事,如果它不能这样做)
无,您不能在网址上使用通配符.. :-(
您必须使用列表解析页面,然后在循环中获取并处理页面。 要从页面内容中提取特定字段将与WWW ::机械化一个伟大的任务...
UPDATE:回答OP评论:
试试这个逻辑:
use strict;
use warnings;
use WWW::Mechanize;
use LWP::Simple;
use File::Basename;
my $mech = WWW::Mechanize->new(autocheck => 1);
$mech->get("http://millercenter.org/president/clinton/oralhistoryml");
# find all <dl> tags
my @list = $mech->find('dl');
foreach my $link (@list) {
my $url = $link->url();
my $localfile = basename($url);
my $localpath = "./$localfile";
print "$localfile\n";
getstore($url, $localpath);
}
嗯..我有点困惑。你是说我可以解析目录页面,然后创建一个循环让'get'能够读取该页面上的链接?如果是这样,你有这样的例子吗?如果我误解了你的回复,请告诉我! – MikeEMKI
我的答案是专注于如何做到这一点的方法。 我不提供代码。
链接中没有ID,但采访页面的名称似乎很好用。你需要解析出来并建立一个查找表。
基本上,你通过构建一个解析器来获取所有看起来像面试的链接。WWW :: Mechanize相当简单。该页面的网址是:
所有采访遵循这个模式:
http://millercenter.org/president/clinton/oralhistory/george-mitchell
所以,你可以在该页面与启动所有链接http://millercenter.org/president/clinton/oralhistory/
。然后你让它们变得独一无二,因为有这个传情箱滑块的东西展示了其中的一些,并且它有一个阅读更多链接到页面。使用哈希来做这样的事情:
my %seen;
foreach my $url (@urls) {
$mech->get($url) unless $seen{$url};
$seen{$url}++;
}
然后你抓取页面,做你的东西,并把它写入你的数据库。使用URL的URL或访问名称部分(例如goerge-mitchell
)作为主键。如果还有其他总统,并且您也想要这些,请在几位总统同名的情况下进行调整。
然后你回去并在你的代码中添加一个缓存查找。在开始获取页面之前,您从数据库中获取所有ID,并将其放入哈希中。
# prepare query and stuff...
my %cache;
while (my $res = $sth->fetchrow_hashref) {
$cache{$res->{id}}++;
}
# later...
foreach my $url (@urls) {
next if $cache{$url}; # or grab the ID out of the url
next if $seen{$url};
$mech->get($url);
$seen{$url}++;
}
您还需要筛选出不是面试的链接。其中之一是http://millercenter.org/president/clinton/oralhistory/clinton-description
,这是阅读页面上的第一款多。
至于从页面提取数据,这是一个不同的问题。一旦你到达那里,你应该单独询问。 – simbabque
你的线条与''//破坏你的代码。 Perl的注释仅适用于您已经使用过的'#'。 – simbabque
哎呀!我手动添加了这些,这是我的错误。我在脚本中有#,所以它没有任何问题在运行。谢谢你指出,虽然。我会编辑它。 – MikeEMKI