用Perl和HTTP::Tiny库的爬虫

HTTP::Tiny是Perl的一个轻量级HTTP客户端,适合简单的请求,但不像LWP那样功能全面,不过对于基本需求应该足够了。

首先,我需要熟悉HTTP::Tiny的基本用法。比如如何发起GET请求,设置user-agent,处理响应。用户可能还需要处理异常,比如连接错误或者超时。另外,可能需要设置超时时间,避免脚本卡住。用户代理的设置也很重要,有些网站会阻止默认的User-Agent。

然后,考虑用户可能需要解析HTML内容,这时候需要推荐一个模块,比如HTML::TreeBuilder或者Mojo::DOM。不过用户的问题只提到HTTP::Tiny,所以可能在回答中需要提到这些解析库作为后续步骤,但核心是抓取部分。

以下是一个使用Perl和HTTP::Tiny库编写的简单网页爬虫示例,包含详细注释和解析建议:

perl 复制代码
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Tiny;

# 创建HTTP::Tiny客户端并配置参数
my $http = HTTP::Tiny->new(
    agent      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',  # 伪装浏览器User-Agent
    timeout    => 10,               # 10秒超时
    verify_SSL => 1,                # 启用SSL验证
);

# 目标URL(示例使用测试网站,实际使用时请替换并遵守robots.txt)
my $url = 'https://example.com';

# 发送HTTP GET请求
my $response = $http->get($url);

# 检查请求是否成功
if ($response->{success}) {
    # 获取响应内容(注意编码处理)
    my $content = $response->{content};
    
    # 检测内容编码(示例:假设是UTF-8)
    # 实际可能需要根据响应头或<meta>标签判断
    # utf8::decode($content);  # 如果需要转换编码
    
    # 简单输出内容(前200字符)
    print "Success! Content preview:\n";
    print substr($content, 0, 200), "\n...\n";
    
    # 这里可以添加HTML解析代码
} else {
    # 输出错误信息
    my $status = $response->{status};
    my $reason = $response->{reason} || 'Unknown error';
    warn "Request failed: $status $reason\n";
    
    # 输出详细的响应头(调试用)
    if ($response->{headers}) {
        while (my ($k, $v) = each %{$response->{headers}}) {
            warn "$k: $v\n";
        }
    }
}

### HTML解析示例(需额外安装模块)
# 使用HTML::TreeBuilder解析示例:
# use HTML::TreeBuilder;
# my $tree = HTML::TreeBuilder->new;
# $tree->parse($content);
# my $title = $tree->look_down('_tag', 'title')->as_trimmed_text;
# print "Page title: $title\n";

# 更现代的Mojo::DOM解析示例:
# use Mojo::DOM;
# my $dom = Mojo::DOM->new($content);
# say "Links:";
# $dom->find('a')->each(sub {
#     my ($el) = @_;
#     say $el->attr('href'), ' => ', $el->text;
# });

注意事项:

  1. 合法合规

    • 始终检查目标网站的robots.txt文件(通常是/robots.txt
    • 遵守网站的服务条款
    • 设置合理的请求频率(建议添加3-5秒延迟)
  2. 性能优化:

    perl 复制代码
    # 可以添加延迟(单位:秒)
    sleep 3;  # 在连续请求之间添加延迟
  3. 高级配置建议:

    perl 复制代码
    my $http = HTTP::Tiny->new(
        max_redirect => 5,      # 最大重定向次数
        default_headers => {
            referer => 'https://google.com',  # 伪造来源
            accept  => 'text/html,application/xhtml+xml',
        },
    );
  4. POST请求示例:

    perl 复制代码
    my $post_response = $http->post(
        'https://example.com/login',
        {
            content => 'user=admin&pass=123',  # 或使用Form::Tiny模块处理
            headers => { 'Content-Type' => 'application/x-www-form-urlencoded' }
        }
    );
  5. 代理支持:

    perl 复制代码
    my $http_with_proxy = HTTP::Tiny->new(
        proxy => 'http://proxy.example.com:8080',
        # 或者根据协议自动选择代理
        # proxies => {
        #    http  => 'http://proxy.example.com:8080',
        #    https => 'https://proxy.example.com:8081',
        # }
    );

建议安装的解析模块:

  • HTML::TreeBuilder:传统HTML解析器
  • Mojo::DOM(需要安装Mojolicious):更现代的CSS选择器语法
  • Web::Query:jQuery风格的HTML操作

使用前请通过CPAN安装所需模块:

bash 复制代码
cpan install HTML::TreeBuilder Mojolicious Web::Query

请根据实际需求调整代码,并始终遵守目标网站的爬取规则和相关法律法规。

相关推荐
Lucky高2 小时前
HTTP和HTTPS复习
网络协议·http·https
小白学大数据2 小时前
基于Python的新闻爬虫:实时追踪行业动态
开发语言·爬虫·python
小白iP代理4 小时前
动态IP+AI反侦测:新一代爬虫如何绕过生物行为验证?
人工智能·爬虫·tcp/ip
喵手8 小时前
Java 11 新特性:从模块化到 HTTP/2 深度解析
java·开发语言·http
叫我:松哥19 小时前
基于网络爬虫的在线医疗咨询数据爬取与医疗服务分析系统,技术采用django+朴素贝叶斯算法+boostrap+echart可视化
人工智能·爬虫·python·算法·django·数据可视化·朴素贝叶斯
bksheng1 天前
【SSL证书校验问题】通过 monkey-patch 关掉 SSL 证书校验
网络·爬虫·python·网络协议·ssl
叫我:松哥1 天前
优秀案例:基于python django的智能家居销售数据采集和分析系统设计与实现,使用混合推荐算法和LSTM算法情感分析
爬虫·python·算法·django·lstm·智能家居·推荐算法
菜鸟是大神1 天前
【已解决】docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request c
http·docker·容器
xnglan2 天前
使用爬虫获取游戏的iframe地址
开发语言·爬虫·python·学习
Arwen3032 天前
从 “http” 到 “https”:只差一张 SSL
http·https·ssl