3

生の文字列だけを使用してPOSTリクエストを送信したい。

私はパーサーを書いています。私はページをロードし、firebugに多くのヘッダーと本文があるような複雑なリクエストを見ました:

__EVENTTARGET=&__EVENTARGUMENT=&__VIEW.... (11Kb or unreadable text)

この正確なリクエストをもう一度手動で(ヘッダー+投稿本文)手動で(巨大な文字列として渡す)送信するにはどうすればよいですか?

好き:

func("%(headers) \n \n %(body)" % ... )

スクリプトで送信(および応答を処理)したいのですが、パラメーターとヘッダーの辞書を手動で作成したくありません。

ありがとうございました。

4

2 に答える 2

7

もう1つの答えは、大きくて混乱しすぎて、あなたが求めている以上のものを示していました。将来の読者が出くわすために、もっと簡潔な答えを含めるべきだと感じました。

import urllib2
import urllib
import urlparse

# this was the header and data strings you already had
headers = 'baz=3&foo=1&bar=2'
data = 'baz=3&foo=1&bar=2'

header_dict = dict(urlparse.parse_qsl(headers))

r = urllib2.Request('http://www.foo.com', data, headers)
resp = urllib2.urlopen(r)

少なくともヘッダーを解析してdictに戻す必要がありますが、その作業は最小限です。次に、それをすべて新しいリクエストに渡します。

*注:この簡潔な例では、ヘッダーとデータ本文の両方がapplication/x-www-form-urlencodedフォーマットであると想定しています。ヘッダーがのような生の文字列形式である場合、Key: Value最初にそれを解析する方法の詳細については、他の回答を参照してください。

最終的には、生のテキストをコピーして貼り付けて、新しいリクエストを実行することはできません。適切な形式のヘッダーとデータに分割する必要があります。

于 2012-07-07T16:31:35.703 に答える
2
import urllib
import urllib2

# DATA:

# option #1 - using a dictionary
values = {'name': 'Michael Foord', 'location': 'Northampton', 'language': 'Python' }
data = urllib.urlencode(values)

# option #2 - directly as a string
data = 'name=Michael+Foord&language=Python&location=Northampton'

# HEADERS:

# option #1 - convert a bulk of headers to a dictionary (really, don't do this)    

headers = '''
Host: www.http.header.free.fr
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
Accept-Language: Fr
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)
Connection: Keep-Alive
'''

headers = dict([[field.strip() for field in pair.split(':', 1)] for pair in headers.strip().split('\n')])

# option #2 - just use a dictionary

headers = {'Accept': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,',
           'Accept-Encoding': 'gzip, deflate',
           'Accept-Language': 'Fr',
           'Connection': 'Keep-Alive',
           'Host': 'www.http.header.free.fr',
           'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)'}

# send the request and receive the response

req = urllib2.Request('http://www.someserver.com/cgi-bin/register.cgi', data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
于 2012-07-07T15:59:05.120 に答える