编写一个小而灵活的HTTP客户端
我想了解大家是怎么写一个快速(小巧)但又灵活的HTTP客户端的。这里的“快速”是指代码量不多(具体多少你们自己决定),最好是使用语言自带的函数,而不是下载的或者自定义的库,这样只要对套接字编程有基本了解,就能明白代码是怎么工作的。“灵活”则是指你应该能够轻松处理接收到的数据。我自己写的一个类似的东西是:
#!/usr/bin/perl
use Socket;
use HTML::Parse;
socket(SOCKH, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die $!;
connect(SOCKH,sockaddr_in(80,inet_aton('www.example.com'))) || die $!;
$old_fh = select(SOCKH);
$|=1;
select($old_fh);
print SOCKH "GET / HTTP/1.0\n\n";
while (<SOCKH>) {
$response .= $_;
}
print parse_html($response)->format;
close(<SOCKH>);
这只是一个快速的客户端,我很快会对它进行HTTP/1.1的编辑。如果你有建议可以让它更符合标准,请分享!
更新:这是我代码的更新版本,使用了LWP,正如Sinan Unur建议的那样:
#!/usr/bin/perl
use LWP::Simple;
use HTML::Parse;
$data = parse_html( get( 'www.example.com' ) )->format;
foreach $line ( $data ) {
print $line; // or any other line-based operation
}
7 个回答
2
Python自带了很多功能
你不需要直接处理网络连接的底层细节(当然你也可以这么做)。Python的标准库里有几个更高级的网络/http库,可以直接使用。
比如,在Python 2中,你可以使用urllib2:
import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()
另外,你还可以看看httplib,它提供了稍微低一些级别的访问:
>>> import httplib
>>> conn = httplib.HTTPConnection("www.python.org")
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
9
Perl有一个叫做LWP的工具。我建议你使用它。