设为首页 收藏本站
查看: 980|回复: 0

[经验分享] Perl 关键词搜索机器人

[复制链接]

尚未签到

发表于 2015-12-27 12:08:00 | 显示全部楼层 |阅读模式
  这段代码在网上找的。觉得很不错,准备弄来分析下。。
  看别人的代码也是一种另类的学习方法。在学习的过程当中多看别人的代码能够提升自己的理解。
  特别是一些自己没有用过的模块,通过这些实例就能知道怎么去使用。
  当然,你也可以自己去研究官方那些文档。但是对于我来说,我觉得最快的方法就是看别人写的代码实例。
  或许每个人都有点不同吧。



#!/usr/bin/perl
# siteindexingbot.pl
use warnings;
use strict;
use LWP::Simple;
use LWP::RobotUA;
use WWW::RobotRules;
use HTML::Parse;
use HTML::HeadParser;
use URI::URL;
my ($response, $tree, $link, %scanned);
# the arrays and hashes used to store page data
my (@pages, %titles, %keywords);
my $url = $ARGV[0] or die "Usage: siteindexingbot [url]\n";
my $base_url = &globalize_url('/', $url);
my $robots_txt = $base_url . '/robots.txt';
my $robot_rules = new WWW::RobotRules (
"indexifier/1.0 (libwww-perl-$LWP::VERSION)"
);
# look for and parse the robots.txt file
if (head($robots_txt)) {
print "robots.txt file found OK.\n";
$robot_rules->parse($robots_txt, get($robots_txt));
} else {
print "robots.txt file not found.\n";
}
# build the user agent
my $ua = new LWP::UserAgent (
"indexifier/1.0 (libwww-perl-$LWP::VERSION)",
'me@here.com',
$robot_rules
);
#$ua->proxy('http' => 'http://proxy.mylan.com/' );
$ua->timeout(30);
$ua->max_size(1024 * 100);
$ua->parse_head('TRUE');
&scan($base_url);
open (FILE, ">indexed.txt") or die "Opening indexed.txt: $!";
foreach my $page(@pages) {
print FILE join( "\t",
($page, $titles{$page}, $keywords{$page})
), "\n";
}
close (FILE);
exit;
sub scan {
my $url = shift;
print "Scanning '$url':\n";
if ($scanned{$url}) {
return;
} else {
&get_info($url);   # this is the extra subroutine
$scanned{$url} = 'TRUE';
my @links = &get_links($url);
foreach $link(@links) {
if ($robot_rules->allowed($link)) {
if ($link =~ /^$base_url/i) {
my $request = HTTP::Request->new ('HEAD' => $link);
my $response = $ua->request($request);
my $content_type = $response->header('Content-type');
if ($response->is_error) {
print "Dead link to $link found on $url\n";
} else {
print "$url links to $link\n";
if ($content_type eq 'text/html') {
&scan($link);
} else {
print "$link is not HTML\n";
}
}
} else {
print "$link is not local to $base_url\n";
}
} else {
print "Access to $link is not allowed by robots.txt\n";
}
}
}
return;
}
sub globalize_url {
my ($link, $referring_url) = @_;
my $url_obj = new URI::URL($link, $referring_url);
my $absolute_url = $url_obj->abs->as_string;
$absolute_url =~ s/^(.+?)#(.+?)$/$1/ig;
return $absolute_url;
}
sub get_links {
my $url = shift;
my $request = HTTP::Request->new ('GET' => $url);
$request->header('Accept' => 'text/html');
my $response = $ua->request($request);
my $tree = HTML::Parse::parse_html($response->content);
my $links_ref = $tree->extract_links('a', 'frame', 'iframe');
my @links;
foreach $link(sort @$links_ref) {
push(@links, &globalize_url(${$link}[0], $url));
}
return @links;
}
sub get_info {
my $url = shift;
my $request = HTTP::Request->new('GET' => $url);
$request->header('Accept' => 'text/html');
my $response = $ua->request($request);
my $html = $response->content;
my ($title, $keywords, $type);
my $parser = HTML::HeadParser->new;
$parser->parse($html);
$title = $parser->header('title') || 'Untitled Document';
$keywords = $response->header('X-Meta-description') || 'none';
push (@pages, $url);
$titles{$url} = $title;
$keywords{$url} = $keywords;
return;
}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156925-1-1.html 上篇帖子: Perl-eval 下篇帖子: Perl requires explicit package name
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表