我正在使用this dataset of 2700 foundations开发一台小型收割机。所有数据均可免费使用,不受任何限制或版权保护。
到目前为止我所拥有的:如果我采用WWW :: Mechanize,收获任务应该没问题 - 特别是在进行基于表单的搜索和选择单个条目时。嗯 - 我猜这个算法基本上是两个嵌套循环:外循环运行基于表单的搜索,内循环处理搜索结果。
外部循环将使用页面上第二个搜索表单上的select()
和submit_form()
函数。我们可以在这里使用DOM处理吗?那么 - 我们如何才能获得选择值。
结果的内部循环将使用跟随链接功能使用以下调用来获取实际条目。
$mech->follow_link(url_regex => qr/webgrab_path=http:\/\/evs2000.*\?
Id=\d+$/, n => $result_nbr);
这会将我们的机制浏览器转发到输入页面。基本上,URL查询会查找具有webgrap_path到Id模式的链接,这对于每个数据库条目都是唯一的。 $result_nbr
变量告诉我下一步应该遵循哪一个结果。
如果我们有几个结果页面,我们也会使用相同的技巧遍历结果页面。对于条目信息的语义提取,我们可以使用XML解析实际条目的内容:LibXML的html解析器(在此页面上可以正常工作),因为它为您提供了一些强大的DOM选择(使用XPath)方法。 那么实际的页面循环应该可以在几行Perl中完成(最多20行 - 可能更少)。
但等等:条目页面的处理将是最复杂的部分 的脚本。
方法:原则上我们可以使用单个while循环执行相同的算法 如果我们巧妙地使用back()函数。
你可以给我一个开头的提示 - 输入页面的处理 - 在Perl :: Mechanize中这样做吗?
这就是我所拥有的:
GetThePage(
starting url
);
sub GetThePage {
my $mech ...
my @pages = ...
while(@pages) {
my $page = shift @pages;
$mech->get( $page );
push @pages, GetMorePages( $mech );
SomethingImportant( $mech );
SomethingXPATH( $mech );
}
}
问题是如何找到DOM路径。