亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? robotua.pm

?? ARM上的如果你對底層感興趣
?? PM
字號:
# $Id: RobotUA.pm,v 1.13 1998/01/06 09:59:08 aas Exp $

package LWP::RobotUA;

require LWP::UserAgent;
@ISA = qw(LWP::UserAgent);
$VERSION = sprintf("%d.%02d", q$Revision: 1.13 $ =~ /(\d+)\.(\d+)/);

require WWW::RobotRules;
require HTTP::Request;
require HTTP::Response;

use Carp ();
use LWP::Debug ();
use HTTP::Status ();
use HTTP::Date qw(time2str);
use strict;

=head1 NAME

LWP::RobotUA - A class for Web Robots

=head1 SYNOPSIS

  require LWP::RobotUA;
  $ua = new LWP::RobotUA 'my-robot/0.1', 'me@foo.com';
  $ua->delay(10);  # be very nice, go slowly
  ...
  # just use it just like a normal LWP::UserAgent
  $res = $ua->request($req);

=head1 DESCRIPTION

This class implements a user agent that is suitable for robot
applications.  Robots should be nice to the servers they visit.  They
should consult the F<robots.txt> file to ensure that they are welcomed
and they should not send too frequent requests.

But, before you consider writing a robot take a look at
<URL:http://info.webcrawler.com/mak/projects/robots/robots.html>.

When you use a I<LWP::RobotUA> as your user agent, then you do not
really have to think about these things yourself.  Just send requests
as you do when you are using a normal I<LWP::UserAgent> and this
special agent will make sure you are nice.

=head1 METHODS

The LWP::RobotUA is a sub-class of LWP::UserAgent and implements the
same methods. In addition the following methods are provided:

=over 4

=cut


#
# Additional attributes in addition to those found in LWP::UserAgent:
#
# $self->{'delay'}    Required delay between request to the same
#                     server in minutes.
#
# $self->{'rules'}     A WWW::RobotRules object
#


=item $ua = LWP::RobotUA->new($agent_name, $from, [$rules])

Your robot's name and the mail address of the human responsible for
the robot (i.e. you) is required by the constructor.

Optionally it allows you to specify the I<WWW::RobotRules> object to
use.

=cut

sub new
{
    my($class,$name,$from,$rules) = @_;

    Carp::croak('LWP::RobotUA name required') unless $name;
    Carp::croak('LWP::RobotUA from address required') unless $from;

    my $self = new LWP::UserAgent;
    $self = bless $self, $class;

    $self->{'delay'} = 1;   # minutes
    $self->{'agent'} = $name;
    $self->{'from'}  = $from;
    $self->{'use_sleep'} = 1;

    if ($rules) {
	$rules->agent($name);
	$self->{'rules'} = $rules;
    } else {
	$self->{'rules'} = new WWW::RobotRules $name;
    }

    $self;
}


=item $ua->delay([$minutes])

Set the minimum delay between requests to the same server.  The
default is 1 minute.

=item $ua->use_sleep([$boolean])

Get/set a value indicating wether the UA should sleep() if request
arrive to fast (before $ua->delay minutes has passed).  The default is
TRUE.  If this value is FALSE then an internal SERVICE_UNAVAILABLE
response will be generated.  It will have an Retry-After header that
indicate when it is OK to send another request to this server.

=cut

sub delay     { shift->_elem('delay',     @_); }
sub use_sleep { shift->_elem('use_sleep', @_); }

sub agent
{
    my $self = shift;
    my $old = $self->SUPER::agent(@_);
    if (@_) {
	# Changing our name means to start fresh
	$self->{'rules'}->agent($self->{'agent'}); 
    }
    $old;
}


=item $ua->rules([$rules])

Set/get which I<WWW::RobotRules> object to use. 

=cut

sub rules {
    my $self = shift;
    my $old = $self->_elem('rules', @_);
    $self->{'rules'}->agent($self->{'agent'}) if @_;
    $old;
}


=item $ua->no_visits($netloc)

Returns the number of documents fetched from this server host. Yes I
know, this method should probably have been named num_visits() or
something like that :-(

=cut

sub no_visits
{
    my($self, $netloc) = @_;
    $self->{'rules'}->no_visits($netloc);
}

*host_count = \&no_visits;  # backwards compatibility with LWP-5.02


=item $ua->host_wait($netloc)

Returns the number of seconds (from now) you must wait before you can
make a new request to this host.

=cut

sub host_wait
{
    my($self, $netloc) = @_;
    return undef unless defined $netloc;
    my $last = $self->{'rules'}->last_visit($netloc);
    if ($last) {
	my $wait = int($self->{'delay'} * 60 - (time - $last));
	$wait = 0 if $wait < 0;
	return $wait;
    }
    return 0;
}


sub simple_request
{
    my($self, $request, $arg, $size) = @_;

    LWP::Debug::trace('()');

    # Do we try to access a new server?
    my $allowed = $self->{'rules'}->allowed($request->url);

    if ($allowed < 0) {
	LWP::Debug::debug("Host is not visited before, or robots.txt expired.");
	# fetch "robots.txt"
	my $robot_url = $request->url->clone;
	$robot_url->path("robots.txt");
	$robot_url->params(undef);
	$robot_url->query(undef);
	LWP::Debug::debug("Requesting $robot_url");

	# make access to robot.txt legal since this will be a recursive call
	$self->{'rules'}->parse($robot_url, ""); 

	my $robot_req = new HTTP::Request 'GET', $robot_url;
	my $robot_res = $self->request($robot_req);
	my $fresh_until = $robot_res->fresh_until;
	if ($robot_res->is_success) {
	    LWP::Debug::debug("Parsing robot rules");
	    $self->{'rules'}->parse($robot_url, $robot_res->content, 
				    $fresh_until);
	} else {
	    LWP::Debug::debug("No robots.txt file found");
	    $self->{'rules'}->parse($robot_url, "", $fresh_until);
	}

	# recalculate allowed...
	$allowed = $self->{'rules'}->allowed($request->url);
    }

    # Check rules
    unless ($allowed) {
	return new HTTP::Response
	  &HTTP::Status::RC_FORBIDDEN, 'Forbidden by robots.txt';
    }

    my $netloc = $request->url->netloc;
    my $wait = $self->host_wait($netloc);

    if ($wait) {
	LWP::Debug::debug("Must wait $wait seconds");
	if ($self->{'use_sleep'}) {
	    sleep($wait)
	} else {
	    my $res = new HTTP::Response
	      &HTTP::Status::RC_SERVICE_UNAVAILABLE, 'Please, slow down';
	    $res->header('Retry-After', time2str(time + $wait));
	    return $res;
	}
    }

    # Perform the request
    my $res = $self->SUPER::simple_request($request, $arg, $size);

    $self->{'rules'}->visit($netloc);

    $res;
}


=item $ua->as_string

Returns a text that describe the state of the UA.
Mainly useful for debugging.

=cut

sub as_string
{
    my $self = shift;
    my @s;
    push(@s, "Robot: $self->{'agent'} operated by $self->{'from'}  [$self]");
    push(@s, "    Minimum delay: " . int($self->{'delay'}*60) . "s");
    push(@s, "    Will sleep if too early") if $self->{'use_sleep'};
    push(@s, "    Rules = $self->{'rules'}");
    join("\n", @s, '');
}

1;

=back

=head1 SEE ALSO

L<LWP::UserAgent>, L<WWW::RobotRules>

=head1 COPYRIGHT

Copyright 1996-1997 Gisle Aas.

This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产三级精品三级在线专区| 欧美日韩一区精品| 久久66热re国产| 麻豆成人免费电影| 精品无人区卡一卡二卡三乱码免费卡| 亚洲女人****多毛耸耸8| 日本一区二区三区国色天香 | 成人看片黄a免费看在线| 美女网站一区二区| 国产成人午夜高潮毛片| 国产成人一级电影| av日韩在线网站| 欧美性做爰猛烈叫床潮| 日韩一区二区三区三四区视频在线观看| 欧美精品丝袜中出| 欧美精品一区二区三区蜜臀| 久久久久久综合| 中文字幕中文字幕中文字幕亚洲无线 | 亚洲视频免费在线| 亚洲一区在线观看免费观看电影高清 | 欧美色综合久久| 精品精品国产高清一毛片一天堂| 久久免费电影网| 亚洲一区二区在线免费看| 久久国产福利国产秒拍| 91麻豆高清视频| 精品国产91乱码一区二区三区| 国产亚洲人成网站| 日韩精品一级中文字幕精品视频免费观看 | 国产免费成人在线视频| 视频一区视频二区中文字幕| 成人一区二区在线观看| 91精品国产一区二区三区| 中文字幕亚洲区| 国产综合色精品一区二区三区| 色综合色狠狠综合色| 久久精品亚洲麻豆av一区二区| 五月婷婷激情综合网| 欧美中文字幕一区| 亚洲免费观看高清完整版在线观看| 久久99九九99精品| 欧美一级在线观看| 天堂在线一区二区| 欧美一区二区女人| 蜜桃一区二区三区四区| 7777精品伊人久久久大香线蕉完整版 | 99久久精品国产麻豆演员表| 亚洲国产精品成人久久综合一区| 激情综合网av| 精品电影一区二区三区 | 成人免费毛片嘿嘿连载视频| 精品剧情v国产在线观看在线| 日本欧美在线看| 日韩欧美卡一卡二| 国产成人精品三级| 一区二区三区中文字幕电影 | 亚洲国产岛国毛片在线| zzijzzij亚洲日本少妇熟睡| 日韩伦理av电影| 欧美日韩电影一区| 久国产精品韩国三级视频| 久久蜜臀精品av| 成人免费观看视频| 亚洲综合一区二区精品导航| 777色狠狠一区二区三区| 麻豆久久久久久| 亚洲欧洲日韩综合一区二区| 欧美日韩精品是欧美日韩精品| 免费在线成人网| 亚洲一区二区三区在线看| 精品国产一区二区三区久久久蜜月 | 日韩精品亚洲一区| 亚洲视频综合在线| 日韩精品一区二区三区在线| 91视频观看视频| 久久激情综合网| 亚洲成人精品影院| 国产精品美日韩| 欧美高清在线一区二区| 欧美大尺度电影在线| 在线免费一区三区| 91视频.com| 风流少妇一区二区| 国产在线乱码一区二区三区| 国产成人在线观看免费网站| 日韩三级电影网址| 欧美日韩一区三区四区| 在线观看免费一区| 欧美综合天天夜夜久久| 91啦中文在线观看| 一本大道久久a久久精二百| 成人午夜av影视| 不卡视频一二三四| 97久久精品人人做人人爽50路| 国产成人在线色| www.亚洲色图| 色嗨嗨av一区二区三区| 在线观看一区不卡| 在线91免费看| 2021中文字幕一区亚洲| 久久免费国产精品| 亚洲欧美区自拍先锋| 亚洲欧洲精品一区二区精品久久久| 国产精品天干天干在观线| 中文字幕一区日韩精品欧美| 一区二区三区四区乱视频| 亚洲一区二区三区美女| 久久精品国产成人一区二区三区| 国产一区二区三区四区五区美女| 国产盗摄女厕一区二区三区| www.66久久| 日韩欧美一二三| 亚洲九九爱视频| 久久激情五月激情| 欧美色精品在线视频| 亚洲精品在线观| 一区二区三区欧美在线观看| 国模无码大尺度一区二区三区| av亚洲精华国产精华精| 日韩一区二区三区在线| 一区二区三区蜜桃网| 国产成人免费高清| 日韩免费在线观看| 午夜av一区二区| 91成人免费在线视频| 中文字幕在线观看不卡| 国内精品视频一区二区三区八戒| 欧美日韩综合色| 依依成人精品视频| 不卡一区二区在线| 中文字幕中文字幕一区| 国产精品一区二区三区乱码 | 久久天天做天天爱综合色| 亚洲国产一区在线观看| 91丨porny丨最新| 亚洲一区二区三区影院| 欧美综合一区二区| 午夜激情久久久| 日韩欧美激情在线| 国精产品一区一区三区mba视频| 精品少妇一区二区三区日产乱码 | 成人午夜又粗又硬又大| 国产精品天干天干在线综合| av亚洲产国偷v产偷v自拍| 亚洲黄色片在线观看| 欧美色手机在线观看| 一区二区三区四区在线播放 | 国产精品美女久久久久aⅴ国产馆| 激情综合一区二区三区| 国产精品丝袜一区| 一本一道波多野结衣一区二区| 亚洲欧洲日韩av| 欧美肥妇毛茸茸| 懂色av一区二区三区免费观看| 亚洲婷婷综合久久一本伊一区| 在线观看国产一区二区| 另类小说图片综合网| 欧美国产激情一区二区三区蜜月| 91免费观看在线| 麻豆视频一区二区| 亚洲精品国产无套在线观| 欧美高清视频一二三区| 成人精品一区二区三区四区| 亚洲一线二线三线久久久| 亚洲精品一区二区三区蜜桃下载| 国产盗摄视频一区二区三区| 午夜不卡av免费| 国产日韩成人精品| 日韩欧美在线1卡| 在线观看免费成人| heyzo一本久久综合| 国产一区二区久久| 激情丁香综合五月| 热久久久久久久| 亚洲综合一区二区三区| 最近中文字幕一区二区三区| 久久这里都是精品| 精品美女一区二区| 欧美一二三四区在线| 欧美精品1区2区| 欧美二区乱c少妇| 91麻豆精品国产91久久久| 欧洲精品一区二区三区在线观看| 成人精品一区二区三区中文字幕| 国产一区二区在线免费观看| 久久黄色级2电影| 激情五月婷婷综合网| 久久 天天综合| 婷婷久久综合九色综合伊人色| 91玉足脚交白嫩脚丫在线播放| 天天操天天综合网| 韩日av一区二区| 99精品久久只有精品| 日本乱人伦aⅴ精品| 欧美一区二区在线免费播放| 久久久精品综合| 亚洲免费在线观看| 日本不卡一区二区| 国产精品99久久不卡二区| 色88888久久久久久影院按摩|