上传(post)数据,应该怎么做?
登录完毕后想执行其他的操作,比如上传(post)数据的话,我应该怎么做?
首先要跟刚才一样,需要通过真实操作观察请求记录中对应记录的请求详情,根据 api 的地址和所需参数请求头等信息用代码进行构造,模拟真实的网络请求发送场景。下图为提交表单的请求详情信息:
请求参数
跟上面类似,根据返回的参数和请求头构造代码,结果会如何?
结果返回的状态码是 401,由于 scrapy 默认只处理 2xx 和 3xx 状态的请求、4开头和5开头的都不处理,但是我们又需要观察401状态返回的内容,这怎么办呢?
我们可以在settings.py中空白处新增代码:
""" 状态码处理 """ HTTPERROR_ALLOWED_CODES = [400, 401] 复制代码
然后在下一个方法中观察response回来的数据(这个地方当时作为萌新的我是懵逼的,所以委屈各位读者大佬跟我一起懵逼)。
后来查询了401的意思:未获得授权,也就是用户权限验证不通过。经过多方资料查找,发现请求头中有这么一条:
在这里输入图片标题
它就是用于用户权限验证的,authorization 的值分为两部分:type 和 credentials,前者是验证采用的类型,后者是具体的参数值。这里的类型可以看到用的是 Bearer 类型。
我又去观察登录时候的返回值,发现登录成功后的返回值除了 succeed 之外,还有其他的一些返回值,里面包括了一个叫 access_token 的字段,看样子它是 JWT 登录方式用来鉴权的 token 信息,经过比对确认 authorization 用的也正好就是这个 token 作为值。
那么代码就应该在第一次登录时候,取出access_token的值,并传递下去,用于后面请求的鉴权,所以代码改为:
def is_login(self, response): """ 根据返回值中的message值来判断是否登录成功 如果登录成功则对数据传输页发起请求,并将结果回传给parse方法 如果登录失败则提示 由于后面的用户权限验证需要用到token信息,所以这里取到登录后返回的token并传递给下一个方法 """ results = json.loads(response.text) if results['message'] == "succeed": urls = 'http://xxx.yyy.ccc.aa' access_token = results['data']['access_token'] print("登录成功,开始调用方法") yield Request(url=urls, callback=self.parse, meta={"access_token": access_token}) else: print("登录失败,请重新检查") 复制代码
下面的pase方法中,将 authorization 设定到 header 中以对数据进行请求:
header = { "authorization": "Bearer " + access_token } 复制代码
这样就解决了用户权限的问题,不再出现401
作者:云享专家韦世东
链接:https://juejin.im/post/5c10f6a8e51d451402773605
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 点赞
- 收藏
- 关注作者
评论(0)