2012-01-18 8 views
1

URLからダウンロードして、個々のチャンクをサーバーから戻ってきて分析用に別のファイルに保存する方法はありますか?個々のcUrlチャンクをどのように読んでいますか?

私は、サーバーがJSON出力の終わりが、我々は、我々はそれが何で停止し、端末にカールするとき

「いいえ、それはありません」と言っているから回答を得ている会社を細断されたと思うとき、私は問題があります私はチャンクだと思うし、打つ入力はより多くのデータを返します、それは間違いなくチャンクですか?

それ以外の場合は、各チャンクをファイルに保存するスクリプトを探したいと思います。

答えて

1

#!/usr/bin/env python 
import sys 
from contextlib import closing as C 

import pycurl 

class Writer: 
    def __init__(self, file): 
     self.file = file 

    def write(self, data): 
     sys.stderr.write(data) 
     self.file.write(data) 

    def close(self): 
     self.file.close() 

url = 'http://stackoverflow.com/questions/8909710/' 
with C(pycurl.Curl()) as c, C(Writer(open('output','wb'))) as w: 
    c.setopt(c.URL, url) 
    c.setopt(c.WRITEFUNCTION, w.write) 
    c.setopt(c.FOLLOWLOCATION, True) 
    c.perform() 
    print >>sys.stderr, c.getinfo(c.HTTP_CODE), c.getinfo(c.EFFECTIVE_URL) 
+0

この分割はどのようにして行われますか? –

+0

@Joseph Le Brech: 'w.write()'は、受信する必要のあるデータが受信されるとすぐにlibcurlによって呼び出されます。 1バイトにすることも、100KBにすることもできます。この関数の内部では、集約/スライスしてチャンクを取得することができます(チャンクの意味を問わない)。私は 'sys.stderr.write(data)'を追加しました。データが到着したときにそれを見ることができます。 – jfs

+0

はチャンクで、サーバー側からのバッファリングを意味します。 –

2

私はあなたが望むように(私はそれがBSDソケットAPIを使って可能であるとは思わない)カールをする方法を知らないが、私はあなたの問題をデバッグするのに役立つと思う。

私が望むと思うのは、Wiresharkのようなパケットスニファであり、パケットの内容を検査し、「ワイヤ上で」何が起こるかを正確に見ることができます。 docs for pycurl.Curl() objectからの例に基づいて

+0

どのように別のチャンクを返すカールのでしょうか?それはチャンクの間にエスケープ文字を送りますか?なぜそれが私が塊であると思うところで止まるのかを説明するでしょう。 –

+0

wireshark +1、これはこのような問題を診断するのに最適です – muffinista

+0

私はカールが別々のチャンクを返すとは思わない。 TCP接続にはチャンクの概念はなく、ストリームとウィンドウだけがあります。 – cha0site

関連する問題