有没有办法用纯 perl 获取网页?
Is there any way to fetch web pages in pure perl?
我正在一台陈旧的、过时的嵌入式 ARM 计算机上进行开发,没有可供我使用的模块来支持 HTTP 客户端。没有 LWP,没有 HTTP::Tiny,等等
我无法为这个平台编译任何东西。原开发人员早已离开公司,本项目目前处于维护状态
有什么方法可以使用纯 perl 获取 HTTP 页面,最好是 HTTPS 页面?我可以复制到库树中的任何模块(不支持 CPAN...)?
谢谢。
编辑:Perl 解决方案失败我想我可以从 Perl 脚本回退到 运行 wget 或 curl -- 但内存非常有限,所以我想尽可能避免这种情况。
您可以在没有库的情况下进行正常的套接字编程。 Perl 支持大多数 POSIX/c 库来做到这一点。根据您可用的标准库的数量,您的解决方案会有所不同。如果你有像 IO::Socket::INET 这样的普通插座,我会推荐 HTTP::Tiny,比如 @ThisSuitIsBlackNot.
这是一个仅使用 Socket 的程序,如果您需要实现自己的 HTTP 客户端,它应该可以帮助您入门。
use strict;
use warnings;
use Socket qw(PF_INET SOCK_STREAM pack_sockaddr_in inet_aton);
socket(my $socket, PF_INET, SOCK_STREAM, 0) or die "socket: $!";
my $port = getservbyname "http", "tcp";
connect($socket, pack_sockaddr_in($port, inet_aton("www.google.com"))) or die "connect: $!";
send($socket, "GET / HTTP/1.0\r\n", 0);
send($socket, "Host: www.google.com\r\n", 0);
send($socket, "User-Agent: pureperl\r\n\r\n", 0);
while (my $line = <$socket>)
{
print $line;
}
如果您也没有 Socket,则需要手动获取 PF_INET、SOCK_STREAM 和这两个函数的值。
如果你有 IO::Socket,最好使用它:
use strict;
use warnings;
use IO::Socket;
$sock = IO::Socket::INET->new(PeerAddr => 'www.google.com',
PeerPort => 'http(80)',
Proto => 'tcp');
$sock->send("GET / HTTP/1.0\r\n");
$sock->send("Host: www.google.com\r\n");
$sock->send("User-Agent: pureperl\r\n");
$sock->send("\r\n");
while (my $line = <$sock>)
{
print $line;
}
但是如果您有 IO::Socket,那么如果您只是复制 HTTP::Tiny 中的 Tiny.pm 应该会加载它。
我不建议尝试在纯 perl 中解决 HTTPS,或者开始自己实现它。
Failing a perl solution I think I can fall back to running wget or curl from a perl script -- but memory is extremely limited so I'd like to avoid that if possible.
这没有意义,curl
使用的内存比 LWP 少得多。
加载 LWP 在我的机器上使用了将近 3,000 KiB。 curl
的图像大小仅为 125 KiB。
使用curl
.
我正在一台陈旧的、过时的嵌入式 ARM 计算机上进行开发,没有可供我使用的模块来支持 HTTP 客户端。没有 LWP,没有 HTTP::Tiny,等等
我无法为这个平台编译任何东西。原开发人员早已离开公司,本项目目前处于维护状态
有什么方法可以使用纯 perl 获取 HTTP 页面,最好是 HTTPS 页面?我可以复制到库树中的任何模块(不支持 CPAN...)?
谢谢。
编辑:Perl 解决方案失败我想我可以从 Perl 脚本回退到 运行 wget 或 curl -- 但内存非常有限,所以我想尽可能避免这种情况。
您可以在没有库的情况下进行正常的套接字编程。 Perl 支持大多数 POSIX/c 库来做到这一点。根据您可用的标准库的数量,您的解决方案会有所不同。如果你有像 IO::Socket::INET 这样的普通插座,我会推荐 HTTP::Tiny,比如 @ThisSuitIsBlackNot.
这是一个仅使用 Socket 的程序,如果您需要实现自己的 HTTP 客户端,它应该可以帮助您入门。
use strict;
use warnings;
use Socket qw(PF_INET SOCK_STREAM pack_sockaddr_in inet_aton);
socket(my $socket, PF_INET, SOCK_STREAM, 0) or die "socket: $!";
my $port = getservbyname "http", "tcp";
connect($socket, pack_sockaddr_in($port, inet_aton("www.google.com"))) or die "connect: $!";
send($socket, "GET / HTTP/1.0\r\n", 0);
send($socket, "Host: www.google.com\r\n", 0);
send($socket, "User-Agent: pureperl\r\n\r\n", 0);
while (my $line = <$socket>)
{
print $line;
}
如果您也没有 Socket,则需要手动获取 PF_INET、SOCK_STREAM 和这两个函数的值。
如果你有 IO::Socket,最好使用它:
use strict;
use warnings;
use IO::Socket;
$sock = IO::Socket::INET->new(PeerAddr => 'www.google.com',
PeerPort => 'http(80)',
Proto => 'tcp');
$sock->send("GET / HTTP/1.0\r\n");
$sock->send("Host: www.google.com\r\n");
$sock->send("User-Agent: pureperl\r\n");
$sock->send("\r\n");
while (my $line = <$sock>)
{
print $line;
}
但是如果您有 IO::Socket,那么如果您只是复制 HTTP::Tiny 中的 Tiny.pm 应该会加载它。
我不建议尝试在纯 perl 中解决 HTTPS,或者开始自己实现它。
Failing a perl solution I think I can fall back to running wget or curl from a perl script -- but memory is extremely limited so I'd like to avoid that if possible.
这没有意义,curl
使用的内存比 LWP 少得多。
加载 LWP 在我的机器上使用了将近 3,000 KiB。 curl
的图像大小仅为 125 KiB。
使用curl
.