有个需求需要模拟登录csdn获取cookie,对csdn进行后续系列操作,刚开始使用的selenium,功能可以实现,但是效率有点低,
后来改用的requests,遇到不少坑,今天来总结一下。
首先找到csdn登录的url,在故意输错密码的情况下点击登录,检查会发现network中有一个dologin的响应,这就是要提交到服务器的账号密码信息。点开会发现下图所示:请求的url,请求方式post
继续往下翻可以找到我们向服务器发送的请求信息,pwd就是我们提交的密码,user是我们提交的账号,其他几个暂时不知道干嘛用的,不过在后续的操作中发现,uatoken和webumidtoken可有可无。跟以往的form提交不太一样,这里是request payload,用form方式尝试提交了几次发现行不通,于是在网上开始找资料,有位大神给出了解答
解决方法如下:
1、将request payload中的内容放到一个字典中,然后发送post请求时,将这个字典参数使用json.dumps()转化为字符串格式传入进去
2、可以看到它的请求头的content-type字段值为aoolication/json, 也就是说它是json传参,所以我们这里把requests中的data参数改为json就可以了,如:
res = requests.post(url, headers=header, json=data).text
)
打马赛克的地方就是我们的账号和密码,输入自己的账号密码就可以了。到了这一步模拟登陆就已经搞定了
接下来是获取cookie,很简单的一行代码(ps: response.cookies获取到的是一个cookiejar对象,需要使用requests.utils.dict_from_cookiejar来将cookiejar对象转换为一个字典,这个字典后续使用的时候,在请求时直接传入就可以了,如 requests.get ( url , cookies=cookies))
cookies = requests.utils.dict_from_cookiejar(response.cookies)