300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python爬虫-requests cookie模拟登录豆瓣

python爬虫-requests cookie模拟登录豆瓣

时间:2023-02-14 23:36:49

相关推荐

python爬虫-requests cookie模拟登录豆瓣

课程目标:

为什么要模拟登录模拟登录原理 - cookie和session如何识别常用的验证码通过 selenium模拟登录并使用coodie滑动验证码+selenium模拟登录哔哩哔哩

1.为什么要模拟登录

因为很多网站是需要登录之后才可以看到一些数据,所以需要用python模拟登录。

2.模拟登录原理 -cookie和session

request模拟登录豆瓣如下

import jsonimport requestsdef login():username = "xxx@"password = "xxx"url = "/j/mobile/login/basic"headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}post_data = {"ck": "","name": username,"password": password,"remember": "true","ticket": ""}res = requests.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")else:print("登录失败")if __name__ == "__main__":login()

将 cookie 保存到文件中并从文件中读取 cookie

我们在上面已经登录之后,再登录首页,看看我们是否已经登录了。登录之后,右上角会显示我们的用户名,所以用用户名来做下识别。如下

# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = requests.get("/").text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")

我们需要用到 requests 的session,

session = requests.session()

然后在请求中,把 request都换成session,如下,就可以正常登陆了

html = session.get("/", headers=headers).text

但是这样的话,程序退出了,就要重新获取一次,有没有方法可以把cookie保存下来呢?当然有,有2中方法

1. 第一种,利用res的cookies,然后给到下一次请求的cookies参数中,如下

res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")cookie_jar = res.cookieselse:print("登录失败")# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookie_jar).text

上面用的是 cookie_jar 对象,也可以换位 dict对象,如下

res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")cookie_dict = res.cookies.get_dict()else:print("登录失败")# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookie_dict).text

如上,我们只要把 cookie保存到文件中,下次需要的时候再打开即可。要用到python的一个包import pickle,可以让我们很简单的把一个对象写到一个文件中。

1. 用pickle 把对象写入到文件,这里是把 cookie_jar文件写到文件中,及上面的 res.cookies, 不是 .get_dict()

ps: wb, w=write写入,b代表二进制

if res_json['status'] == "success":print("登录成功")f = open("douban.cookie", "wb")pickle.dump(res.cookies, f)f.close()else:print("登录失败")

代码可以用 with 优化如下,自动调动close。

with open("douban.cookie", "wb") as f:pickle.dump(res.cookies, f)

2. 怎么用pickle 读数据, rb 是 read读,b是二进制的方式

with open("douban.cookie", "rb") as f:cookies = pickle.load(f)# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookies).text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")

完整代码如下:

# +--------------------------# | User: zq-# | Version: python3.7-# | Time: -03-16 16:21# +--------------------------import jsonimport requestsimport pickledef login():session = requests.session()username = "xxxx@"password = "xxxxx"url = "/j/mobile/login/basic"headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}post_data = {"ck": "","name": username,"password": password,"remember": "true","ticket": ""}res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")with open("douban.cookie", "wb") as f:pickle.dump(res.cookies, f)else:print("登录失败")with open("douban.cookie", "rb") as f:cookies = pickle.load(f)# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookies).text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")if __name__ == "__main__":login()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。