2017-04-07 9 views
0

私は単純なPOSTリクエストコードを持っています。Python request.post()はPython Scrapyリクエストに変換されても機能しません

headers = { 
    dictionary of headers 
} 

params = (
    ('param1', '0'), 
    ('param2', '5668294380'), 
    ('param3', '8347915011'), 
) 

response = requests.post('https://website.com', headers=headers, params=params, data=__data) 

これはスタンドアロンのPythonプログラムとして完全に機能します。

しかし、私は、Python Scrapyでこれをやりたい

Request(url='https://website.com',callback=self.callback_fun, headers=headers, body=__data, method="POST") 

それはURLがPOSTリクエスト

を扱うことができないことを私に応答を与える、私はそれが私に同じ応答を与える

FormRequest(url='https://website.com',callback=self.callback_fun, headers=headers, body=__data) 

を試してみました。

私は

Request(url='https://website.com?' + urllib.urlencode(self.params),callback=self.callback_fun, headers=headers, body=__data, method="POST") 

をしようとしたが、それは私に400 Bad Request

Scrapyと間違っ

いただきましたを与えますか?純粋なPython Scriptが動作しますが、Scrapyでは動作しません。

主な問題は、Scrapyを使用してparams=paramsを送信する方法です。 Scrapyはbodyパラメータ

+0

実際のWebサイトではなくhttps://httpbin.org/で両方の方法を試して、実際に送信されたリクエストを確認してください。 Scrapyがいくつかのヘッダーを上書きする可能性があります。 –

+0

@AshishNitinPatil私はそのURLをChrome Dev ToolsからcURLとしてコピーしました。そのcURLはShell/Terminalで完璧に動作し、同じcURLをPythonがhttps://curl.trillworks.com/ツールを使用してPOSTに要求するように変換しました。そして、Pythonコードも動作します! Scrapyだけでうまくいきません – Umair

+0

URLではないので、httpbin.orgで調べて、あなたが得た応答を比較するようにお願いします。これはミラーのようなものなので、異なる方法から2つのリクエストの違いを知ることができます。 –

答えて

1
class scrapy.http.FormRequest(url[, formdata, ...]) 

パラメータを経由して要求ペイロードを送信することができます:FORMDATA(辞書やタプルの反復可能) - 辞書 (または(キー、値)タプルの反復可能)であるHTMLフォームのデータを含みます はURLエンコードされ、リクエストの本文に割り当てられます。

HTTPの場合、データを送信する場合、データはリクエスト本体に設定され、エンコードされます。あなたはdictのあなたの自己をエンコードまたはScrapy FormRequestを使用することができます。

class FormRequest(Request): 

def __init__(self, *args, **kwargs): 
    formdata = kwargs.pop('formdata', None) 
    if formdata and kwargs.get('method') is None: 
     kwargs['method'] = 'POST' 

    super(FormRequest, self).__init__(*args, **kwargs) 

    if formdata: 
     items = formdata.items() if isinstance(formdata, dict) else formdata 
     # encode dict here 
     querystr = _urlencode(items, self.encoding) 
     if self.method == 'POST': 
      # set message header 
      self.headers.setdefault(b'Content-Type', b'application/x-www-form-urlencoded') 
      # set message body 
      self._set_body(querystr) 
     else: 
      self._set_url(self.url + ('&' if '?' in self.url else '?') + querystr) 

---------------------------- update-- ------------リクエストコードで

response = requests.post('https://website.com', headers=headers, params=params, data=__data) 

それは最初に修正されたURLにURLにPOSTデータをパラメータを追加します。 URLを変更する必要があります。

print(response.url) 
+0

私はまだ 'HTTPメソッドPOSTがこのURLでサポートされていません。 ' – Umair

+0

これはコード' yieldRequest(url =' https:// website '、callback = self.parse_response、headers = self.headers、formdata = self)です。params、body = __ data) ' – Umair

+0

@Umairは私の更新を確認します –

関連する問題