Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编写一个小而灵活的HTTP客户机_Python_Ruby_Perl_Http - Fatal编程技术网

Python 编写一个小而灵活的HTTP客户机

Python 编写一个小而灵活的HTTP客户机,python,ruby,perl,http,Python,Ruby,Perl,Http,我希望了解人们将如何编写一个快速(小)但灵活的HTTP客户端。所谓快速,我指的是不需要太多的代码(我将让您自己决定这意味着什么),最好使用内置语言函数,而不是下载或自定义库,这样套接字编程的基本知识就足以理解代码的工作原理。我所说的灵活是指您应该能够轻松地处理传入的数据。我自己对这类事情的看法是 #!/usr/bin/perl use Socket; use HTML::Parse; socket(SOCKH, PF_INET, SOCK_STREAM, getprotobyname('tcp

我希望了解人们将如何编写一个快速(小)但灵活的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>);

Perl已经成功了。我建议您使用它。

类似于@Santa的示例,仅在Ruby中:

require 'open-uri'
print open('http://www.example.com').read
如果你想解析内容,Ruby的gem非常棒。它构建在libXML之上


还有许多其他HTTP客户端gem可用,包括和。HTTParty使得向类添加REST功能以及解析JSON和XML的功能变得非常简单。Typhous使得为并行GET/heads/Whatever一次编写多个请求变得很容易。

在您开始需要做任何繁重的事情之前,很多示例似乎都很简单,比如双向传输千兆字节的数据。我最喜欢的是ruby的
net/http
,它是每个ruby安装的一部分

下面是一个示例,它将数据流化,并在完成更多请求后保持连接打开

require 'net/http'

http = Net::HTTP.new('my.server.org')
http.start

req = Net::HTTP::Post.new('/path/to/huge/file')
req.basic_auth('user', 'pass')
req.content_length = File.size 'huge_input_file.txt'
req.body_stream = File.open('huge_input_file.txt', 'rb')

http.request(req){|res|
  File.open('huge_output_file.txt', 'wb'){|f|
    res.read_body {|chunk| f.write chunk}
  }
}


Perl没有任何内置功能
Net::HTTP
LWP::UserAgent
不是perl核心的一部分。不久前,我需要一个PerlHTTP客户机,它的功能与上面的ruby示例类似,不依赖CPAN的任何功能。它用了不到200行代码,只使用了
IO::Socket::INET
syswrite
/
sysread
(这消除了许多底层套接字的废话)和
MIME::Base64
进行身份验证,而是使用http获取内容的脚本

其他人提到和

下面是一个例子,使用文档中的

# Quick JSON request
my $trends = 'http://search.twitter.com/trends.json';
print $client->get($trends)->res->json->{trends}->[0]->{name};

# Extract data from HTML and XML resources
print $client->get('mojolicious.org')->res->dom->at('title')->text;

# Scrape the latest headlines from a news site
my $news = 'http://digg.com';
$client->max_redirects(3);
$client->get($news)->res->dom('h3 > a.story-title')->each(sub {
    print shift->text . "\n";
});
很酷,但不是最成熟的模块

Python包含“电池”

您不需要在套接字级别工作(尽管您可以)。Python在其标准库中构建了几个更高级别的web/http库

例如,在Python 2中,您可以使用:

另请查看,以获得略低级别的访问:

>>> 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()

我看不出对这样一个问题的回答会给你带来什么好处,但我会屈服于同行的压力。既然你似乎不介意用哪种语言

如果您想以有趣的方式操作它:

<?php
$d=new DOMDocument();
$d->loadHTMLFile('http://www.example.com/');
...

是什么需要推动这个轮子的重新发明?因为他有一个如何改进轮子的想法?@MkV:我的需要是我想要一个简单的web客户端框架,如果我有需要的话,我可以在几分钟内组装起来;就像一个普通的程序,用来查看我的大学收件箱中是否有新邮件,或者是一个从几个网页中提取文本的机器人。我不是想重新发明这个“轮子”,我知道这个轮子已经有足够多的神奇版本了,这就是我想要的。@Greg-轮子的改进通常最好是通过修改现有轮子而不是从头开始。@eZanmoto-我很困惑,你知道,有一些奇妙的轮子,可以让你在一分钟内构建一个应用程序,并将web客户端功能添加到应用程序中……那么为什么不使用一个呢?LWP比轻量级稍轻一些。HTTP::Lite(将在下一版本的CPAN模块中使用)可能更合适。File::Fetch包含在核心Perl中,HTTP::Lite可以轻松绑定。文件::Fetch是在5.10中添加的吗?酷+我为此付1英镑tidbit@AlexandrCiornii:File::Fetch不是很有用。它甚至无法获取一个简单的主页:
File::fetch->new(uri=>'http://www.google.com/');我已经说明了我将获得的好处:“我的需要是我想要一个简单的web客户端框架,如果我有需要,我可以在未来几分钟内组装起来”和“我想知道哪些[问题的解决方案]是可用的,不同的语言如何完成任务”。是的,mojo还不成熟,但它很酷,这是莫乔利的。
import urllib2

response = urllib2.urlopen('http://www.example.com/')
html = response.read()
>>> 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()
<?php
$d=new DOMDocument();
$d->loadHTMLFile('http://www.example.com/');
...
<?php
print file_get_contents('http://www.example.com/');