2010-11-18 4 views
2

私は、人々が素早く(小規模で)柔軟なHTTPクライアントを作成する方法を探しています。迅速に私は多くのコードを意味するわけではありません(その意味を決めるためにあなたに任せます)。そして、好ましくは、ダウンロードされたライブラリやカスタムライブラリとは対照的に、組み込みの言語関数を使用してソケットプログラミングの基本知識コードがどのように機能するかを理解するのに十分です。フレキシブルにすると、着信データを簡単に操作できるはずです。このようなものの私自身のバージョンでは、これは私がすぐにHTTP/1.1のために編集することがありますちょうど速いクライアントである、またはあなたが準拠のためにそれをより良くする方法についての提案があれば共有してください小さいながらも柔軟な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>); 

だろう!

EDIT:はシナンUnurとしてLWPを使用して私のコードへの更新は、提案:

#!/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 
} 
+2

何をこの車輪の再発明を動機づけしている必要性はあるのか? – MkV

+0

彼は車輪を改善する方法を知っているので? –

+0

@MkV:私の必要性は、将来的に数分でまとめることができるウェブクライアントのためのシンプルなスケルトンが必要なことです。私の大学の受信箱に新しいメールがあるのか​​、いくつかのウェブページからテキストを抽出するためのボットがあるかどうかを確認するための簡単なプログラムのようです。私はこの「車輪」を再発明しようとしているわけではありません。私は既にこの車輪の素晴らしいバージョン以上のものがあることを知っています。それが私が求めているものです。 –

答えて

1
#!/usr/bin/env python 

import urllib 

f = urllib.urlopen('http://www.example.com') 
print f.read() 
f.close() 
9

PerlはLWPを持っています。私はそれを使用することをお勧めします。

+5

LWPは軽量より少し小さいです。 HTTP :: Lite(CPANモジュールの次のリリースで使用される)は、より適しているかもしれません。 – MkV

2

のみRubyで、サンタの例@に似て:あなたは、コンテンツを解析したい場合は

require 'open-uri' 
print open('http://www.example.com').read 

、RubyのNokogiri宝石は素晴らしいです。これはlibXMLの上に構築されています。

HTTPartyTyphoeusなど、他の多くのHTTPクライアントの宝石が利用できます。 HTTPartyは、JSONとXMLを解析する機能とともに、クラスにREST機能を追加することを自明にします。 Typhoeusは、並列取得/ヘッド/折り返しのために一度に複数の要求を一度に書き込むことを容易にします。

1

ギガバイトのデータを双方向でストリーミングするなど、何か重い作業を行う必要がある場合を除き、たくさんの例がわかりにくいようです。私のお気に入りはルビーのnet/httpです。これはすべてのルビインストールの一部です。

ここでは、データをストリーミングし、より多くのリクエストが終了したら接続を開いたままにしておく例を示します。

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::HTTPLWP::UserAgentはperlコアの一部ではありません。しばらく前に、CPANのものに依存せずに、上記のRubyの例のように機能するperl HTTPクライアントが必要でした。 IO::Socket::INETsyswrite/sysread(これは多くの下位レイヤーのソケットナンセンスを排除します)とMIME::Base64のみを使用して200行以下でした。

+0

File :: FetchがコアPerlに含まれているため、HTTP :: Liteは簡単にバンドルできます。 –

+0

hh。 File :: Fetchが5.10で追加されましたか?クール!その楽しい時間のために+1 –

+0

@Alexandr Ciornii:File :: Fetchはあまり役に立ちません。 'File :: Fetch-> new(uri => 'http://www.google.com/');' – user102008

1

私はあなたが実際に自分のhttpクライアントを書くのではなく、むしろHTTPを使ってものを取り出すスクリプトを取っていると思いますか?

その他にはここでのドキュメントから、Mojo::Clientを使った例だHTTP::LiteLWP::Simple ..

を述べました。

# 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"; 
}); 

クールではありますが、成熟したモジュールではありません。

+0

mojoは成熟していませんが、かなりクールです。モジョリスもそうです。 –

2

は、Pythonはあなたがソケット・レベル(あなたがすることができますが)で仕事をする必要はありません

を「電池が含まれる」しています。 Pythonには、標準ライブラリに構築されたいくつかの上位レベルのweb/httpライブラリがあります。

例えば、Pythonの2で、あなたはurllib2を使用することができます:私は可能何の利益あなたを見ることができない

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

import urllib2 

response = urllib2.urlopen('http://www.example.com/') 
html = response.read() 

も若干低いレベルのアクセスのために、httplibをチェックアウトそのような質問への答えから得ることができますが、私は仲間の圧力に与えるでしょう。あなたが興味深い方法でそれを操作したい場合は...使用する言語を気にする

は思えないので:

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

しかし、単にページを返すに:

<?php 
print file_get_contents('http://www.example.com/'); 
+0

私は、私が得る利益を述べました。「私は、必要があれば数分でまとめることができるウェブクライアントのためのシンプルなスケルトンが必要です」と「私はさまざまな言語がどのようにタスクに近づいているか、[問題の解決方法]が利用可能です。 –

関連する問題