转换为Python Scrapy请求时,Python request.post()无法正常工作

时间:2017-04-07 10:22:26

标签: python scrapy python-requests scrapy-spider

我有简单的POST请求代码。

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")

它给出了我无法处理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脚本工作,但在Scrapy中不起作用。

我认为主要问题是如何使用Scrapy发送params=params。 Scrapy仅允许通过body参数

发送请求有效负载

1 个答案:

答案 0 :(得分:1)

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

参数:formdata(元组的dict或iterable) - 是一个字典   (或者包含HTML表单数据的(key,value)元组的迭代)   将进行网址编码并分配给请求正文。

在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)

----------------------------更新--------------

请求代码中的

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

首先将参数添加到URL,将发布数据添加到修改后的URL。你应该改变你的URL。您可以通过以下方式获取网址:

print(response.url)