ソースページの最初の数バイトのみをダウンロードする


9

cURLコマンドを使用してWebサイトのHTMLソースページをダウンロードしています。問題は、ページのコンテンツのほとんどが必要ないことです。ソースページの最初の100行が必要です。最初の数行の後でページのダウンロードを停止する方法はありますか?

現在、私は以下のコマンドが機能していますが、時間効率が良くないようです。

curl -r[0-1] "http://www.freebase.com/m/045c7b" > foo.txt

私はから値を変更しようとした1.5.05、まだWebページ全体をダウンロードしてきています。

上記のコマンドを実行するために1秒未満の時間を見ています。

編集

manページからはcURL、私は「ことがわかります。また、多くのHTTP / 1.1サーバはこの機能を使用すると、範囲を取得しようとすると、あなたの代わりに、文書全体を取得しますので、有効になっていないことに注意する必要があります。」もしそうならサーバーは範囲クエリnixをサポートしていませんが、環境内に他のコマンドがあり、実行しようとしていることを実行するのに役立ちますか?

回答:


6

あなたは使用することができますheadし、-sスイッチがためにcurlページの一部をダウンロードします。単純に言うheadあなたが望むどのように多くの出力のライン。

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

細部

  • -10するhead10行を返した後、停止します。さらに必要な場合は、ニーズに合わせて変更してください。
  • -sスイッチはcurl、それがダウンロード中にプログレスバーが表示されませんので、それは静かであることを伝えます。

1
コンテンツのダウンロードには、まだかなりの時間がかかります。これが発生するのは、ミリ秒単位の時間範囲であると予想していました。
Ramesh

@Ramesh-はい、私はそれもかなり遅いことに気づきました。サーバーが応答するまでに時間がかかるようです。
slm

@Ramesh -むしろ、あなたはAPIを見てみることをお勧めしますカールを使用してサイトに行く:developers.google.com/freebase
SLMを

うーん、面白い。私の友人は、Javaでfreebase APIを使用した場合、データをダウンロードするのに300 MSを要すると示唆していました。私は、シェルスクリプトを使用して大幅に削減できると彼に言いました。シェルコマンドではなく、サーバーに問題があるようです。
Ramesh 2014

@Ramesh-はい、この場合の遅延はデータベースクエリとそのデータの応答への準備にあります。データベースが他の形式でデータをJSONとして公開する場合、出力をHTTPとして取得する代わりに、それを利用することで応答を迅速化できます。最終的なユースケースが結果を読む人間ではない場合、無駄なHTTPとして応答を準備するオーバーヘッドがあります。
slm

1

この特定のアプリケーションはまだテストしていませんが、ここでddとncをペアにできることがわかります。

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

Netcat(nc)は、リクエストヘッダーを正しく取得するためにさらに設定が必要になる場合がありますが、それがパブリックサイトである場合は、十分に気を付ければ、便利な出力を手に入れることができるはずです。確かに、ddは指定した数だけの入力を受け取り、終了します。これはSIGPIPE netcatになり、すぐに追随します。唯一の真のトリックは、最初のハンドシェイクを解決することです。ストリームを開始したら、いつでも好きなときにドロップできます。

編集

slmのコメントを読んだことで、私はその動きに2番目になりました。JSON POSTを正しい形式でシリアル化できれば、よりタイムリーな応答を確実に得ることができます。とにかく、HTMLの解析は鳥のためのものです。

そのための便利なトリックの1つは、ブラウザーでサーバーと通信しながらネットワークストリームをキャプチャし、ブラウザーがPOSTを送信するときに、代わりにGETとして送信するPOSTを送信し、結果を確認することです。


1

headそれが終了する前に(パイプがクローズされる前に、短いファイルに対して、それがパイプのバッファを満たすかもしれないが)コマンドは、通常はダウンロードを停止します。これは、パイプが閉じcurlていると書き込み先がないためです(ファイル記述子が閉じていると書き込みに失敗します)。

ただし、私の経験では、ダウンロード時に最も長いのはDNS要求を待機していることです(数百のファイルを連続してダウンロードする場合は苦痛です)。これは、ローカルDNSキャッシュのように役立ちdnsmasqます。または、同じドメイン名を異なるディレクトリ構造で何度も使用している場合は、IPに一度解決してURLを置き換えるだけです。

私のポイントを証明するために...試しtime netstattime netstat -n(キャッシュなしの違いは劇的で、キャッシュと、それは最初の時間だけ悪いですが、それは覚えています)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.