2

PyCurlでリクエストを行うときに、返信のヘッダー情報をキャプチャしてアクセスする方法を教えてください。

c = pycurl.Curl() 
c.setopt(c.URL,'MY_URL')
c.setopt(c.COOKIEFILE,'cookies')
c.setopt(c.COOKIE,'cookies')
c.setopt(c.POST,1)
c.setopt(c.POSTFIELDS,'MY AUTH VALUES')
c.setopt(c.VERBOSE, True)
b = StringIO.StringIO()
c.setopt(c.WRITEFUNCTION, b.write)
c.perform()

応答は、バッファーbに書き込まれる適切にフォーマットされたJSONになります。

返信の「Location」ヘッダーの値を復元したいと思います。

curlを使用しようとすると、この値は詳細出力に表示されます。

[... Curl output ...]
> GET XXXXXXXXX
[... Request ...]
[... Curl output ...]
< HTTP/1.1 302 Found
[... Other headers ...]
< Location: YYYYYYYYYYYYYYY
[... Rest of reply ...]

LocationPythonからヘッダーの値を回復するにはどうすればよいですか?

4

3 に答える 3

5

PyCurlを使用する必要がある場合

次に、コールバック関数を渡してヘッダー情報を取得できます。

# code...

# Callback function invoked when header data is ready
def header(buf):
    # Print header data to stderr
    import sys
    sys.stderr.write(buf)
    # Returning None implies that all bytes were written

# more code...

c.setopt(pycurl.HEADERFUNCTION, header)

# yet more code...

詳細については、ドキュメントをご覧ください。

pycurlの代わりにリクエストを使用することもできます

これは不可能な場合があり、質問に直接答えることはできませんが、pyCurlの代わりにrequestsライブラリを使用することをお勧めします。

import requests

payload = {"key":"value"}
cookies = {"key":"value"}

r = requests.post('https://my.example.com', data=payload, cookies=cookies)

location = r.headers["Location"]
content  = r.text

print(content)

それはあなたの人生をはるかに楽にします。ドキュメントを読んで詳細をご覧ください

于 2013-03-26T15:46:59.677 に答える
2

基本的に、多くのカスタム関数とコールバック関数の登録。curlの詳細な出力を区分的に見ていきましょう。まず、独自のを提供すれば、接続に関するビットをほとんど埋めることができますCURLOPT_OPENSOCKETFUNCTION

次に、リクエストヘッダーは、事前に知っているものであり、好きなように印刷できます。プログレスバーには、進行CURLOPT_PROGRESSFUNCTION状況の更新のコールバックを「ほぼ1秒に1回」登録できるがあります。

応答ヘッダー書き込み関数(CURLOPT_HEADERFUNCTION)を登録することもできます。この関数を使用して、応答ヘッダーをキャプチャおよび/または表示できます。

またはCURLOPT_DEBUGFUNCTIONコールバックを登録して、送信するヘッダーの情報を取得したり、応答を取得したりすることもできます。

于 2013-03-26T15:50:01.897 に答える
2
import pycurl
import cStringIO

buf = cStringIO.StringIO()
URL = 'http://stackoverflow.com/questions/15641080/get-header-values-of-reply-using-pycurl'
c = pycurl.Curl()
c.setopt(c.URL, URL)
c.setopt(c.NOBODY, 1)
c.setopt(c.HEADERFUNCTION, buf.write)
c.perform()

header = buf.getvalue()
print header
于 2013-12-28T12:19:56.223 に答える