我有简单的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”)
它给我的回应是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脚本有效,但在Scrapy中不起作用。
我认为主要问题是如何params=params使用Scrapy发送。Scrapy仅允许通过body参数发送请求有效载荷
解决方案
class scrapy.http.FormRequest(url[, formdata, …])
参数:formdata(元组的dict或可迭代)–是一个字典(或(键,值)元组可迭代),包含将被url编码并分配给请求主体的HTML Form数据。
在HTTP中,如果要发布数据,则将数据设置在请求正文中并进行编码。您可以编码自己的字典或使用ScrapyFormRequest:
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)
Original: https://blog.csdn.net/weixin_32620265/article/details/113963680
Author: 漾漾ML
Title: python scrapy request_转换为Python Scrapy Request后,Python request.post()无法正常工作…
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/792787/
转载文章受原作者版权保护。转载请注明原作者出处!