05 学会使用cookie💪💪💪
项目:登录后发表评论(开课吧食堂、账号:kaikeba,密码:kaikeba888)
一、目标📝📝📝
1、学习cookies
2、学习session
3、存储cookies
4、读取cookies
二、首先了解什么是cookies❓
简单的来说就我们灯枯某个网站的时侯勾选“记住我”选项,当我们再次打开这个网址的时候就会自动登录,这就是cookies起作用
三、我们再使用手动登录,配合检查工具查看我们的登录信息(使用检查时记得勾选Preserve log,避免跳转界面是请求丢失)
1、如图进行操作
2、我们在众多请求中找到login请求(在Form Data存在我登陆时的所填信息)
①log为我们的账号
②pwd为我的密码(只不过进行加密)
③使用简单的代码模拟用户手动登录
状态码为200说明登录成功了
四、发送评论
想要发表评论,首先得登录,其次得提取和调用登录cookie,然后还需要品论参数,才能完成评论
1、首先了解post请求和get请求
是否在url中显示参数 | 对于用户账号和密码的安全性 | |
get请求 | 是 | 低 |
post请求 | 不显示 | 高 |
2、发送评论
import requests #引入requests。 url_login = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' #把请求登录的网址赋值给url。 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } #加请求头,为了避免被反爬虫 data_login = { 'log': input("请输入账号:"), #写入账户 'pwd': input("请输入密码:"), #写入密码 'wp-submit': '登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie': '1' } #把有关登录的参数封装成字典,赋值给data。 login_in = requests.post(url_login,headers=headers,data=data_login) #用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。 cookie = login_in.cookies #提取cookie的方法:调用requests对象(login_in)的cookie属性获得登录的cookie,并赋值给变量cookie。 url_comment = 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/comment-page-1095/#comment-11650' #我们想要评论的文章网址。 data_comment = { 'comment': input('请输入你想要发表的评论:'), 'submit': '发表评论', 'comment_post_ID': '35', 'comment_parent': '0' } #把有关评论的参数封装成字典。 comment = requests.post(url_comment,headers=headers,data=data_comment,cookies=cookie) #用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookie参数,赋值给comment。 #调用cookie的方法就是在post请求中传入cookie=cookie的参数。 print(comment.status_code) #打印出comment的状态码,若状态码等于200,则证明我们评论成功。
运行结果:
五、session及其用法
1、理解什么是会话
可以简单的理解为我们用浏览器上网,到关闭浏览器的过程,session是会话的过程,用来记录特定用户会话的信息
①如果没有session,就会出现你加购物车的很多商品,在结算时购物车空无一物,因为服务器没有帮你记录你想买的产品
②session和cookie的关系——cookie中存储着session的编码信息,session中又存储了cookie的信息
③当浏览器第一访问购物网站时,服务器会返回set cookie的字段给浏览器,而浏览器会把cookie保存到本地
④等浏览器第二次访问购物网页时,就会带着cookie去请求,而因为cookie里面带着编码信息,服务器立刻马上就能辨认出这个用户,同时返回和这个用相关的特定编码的session
代码实现
import requests session = requests.session() #用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保持了cookie。 url_login = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } data_login = { 'log':input('请输入账号:'), #用input函数填写账号和密码,这样代码更优雅,而不是直接把账号密码填上去。 'pwd':input('请输入密码:'), 'wp-submit':'登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie':'1' } session.post(url_login,headers=headers,data=data_login) #在创建的session下用post发起登录请求,放入参数:请求登录的网址、请求头和登录参数。 url_comment = 'https://xiaoke.kaikeba.com/example/wordpress/wp-comments-post.php' #把我们想要评论的文章网址赋值给url_comment。 data_comment = { 'comment': input('请输入你想要发表的评论:'), 'submit': '发表评论', 'comment_post_ID': '35', 'comment_parent': '0' } #把有关评论的参数封装成字典。 comment = session.post(url_comment,headers=headers,data=data_comment) #在创建的session下用post发起评论请求,放入参数:文章网址,请求头和评论参数,并赋值给comment。 print(comment) #打印comment
六、存储cookie
1、先用代码打印cookie看看
import requests session = requests.session() url_login = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } data_login = { 'log':input('请输入账号:'), 'pwd':input('请输入密码:'), 'wp-submit':'登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie':'1' } session.post(url_login,headers=headers,data=data_login) print(type(session.cookies)) #打印cookie的类型,session.cookies就是登录的cookie print(session.cookies) #打印cookie
运行结果:
①RequestsCookieJar是cookie的对象类,cookie本身的内容像一个列表,里面又有点像字典的键与值
②那么到底如何存储cookie呢
代码实现:
import requests import json #引入requests和json模块。 session = requests.session() url = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } data = { 'log': input('请输入你的账号:'), 'pwd': input('请输入你的密码:'), 'wp-submit': '登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie': '1' } session.post(url, headers=headers, data=data) cookie_dict = requests.utils.dict_from_cookiejar(session.cookies) #把cookie转化成字典。 print(cookie_dict) #打印cookie_dict cookie_str = json.dumps(cookie_dict) #调用json模块的dumps函数,把cookie从字典再转成字符串。 print(cookie_str) #打印cookie_str f = open('cookie.txt', 'w') #创建名为cookie.txt的文件,以写入模式写入内容。 f.write(cookie_str) #把已经转成字符串的cookie写入文件。 f.close() #关闭文件。
七、读取cookie
代码实现:
import requests import json session = requests.session() #创建会话。 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } #添加请求头,避免被反爬虫。 try: #如果能读取到cookie文件,执行以下代码,跳过except的代码,不用登录就能发表评论。 cookie_txt = open('cookie_kaikeba.txt', 'r') #以reader读取模式,打开名为cookie.txt的文件。 cookie_dict = json.loads(cookie_txt.read()) #调用json模块的loads函数,把字符串转成字典。 cookie = requests.utils.cookiejar_from_dict(cookie_dict) #把转成字典的cookie再转成cookie本来的格式。 session.cookies = cookie #获取cookie:就是调用requests对象(session)的cookie属性。 except FileNotFoundError: #如果读取不到cookie文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookie,再评论。 print("存储cookie的文件不存在") url = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' #登录的网址。 data = {'log': input('请输入你的账号:'), 'pwd': input('请输入你的密码:'), 'wp-submit': '登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie': '1'} #登录的参数。 session.post(url, headers=headers, data=data) #在会话下,用post发起登录请求。 cookie_dict = requests.utils.dict_from_cookiejar(session.cookies) #把cookie转化成字典。 cookie_str = json.dumps(cookie_dict) #调用json模块的dump函数,把cookie从字典再转成字符串。 f = open('cookie_kaikeba.txt', 'w') #创建名为cookie.txt的文件,以写入模式写入内容 f.write(cookie_str) #把已经转成字符串的cookie写入文件 f.close() #关闭文件 url_comment = 'https://xiaoke.kaikeba.com/example/wordpress/wp-comments-post.php' #文章的网址。 data_comment = { 'comment': input('请输入你想要发表的评论:'), 'submit': '发表评论', 'comment_post_ID': '35', 'comment_parent': '0' } #评论的参数。 comment = session.post(url_comment,headers=headers,data=data_comment) #在创建的session下用post发起评论请求,放入参数:文章网址,请求头和评论参数,并赋值给comment。 print(comment.status_code) #打印comment的状态码
八、项目完整代码
import requests import json session = requests.session() headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } def cookie_read(): # cookie读取。 cookie_txt = open('cookie_kaikeba.txt', 'r') cookie_dict = json.loads(cookie_txt.read()) cookie = requests.utils.cookiejar_from_dict(cookie_dict) return (cookie) def sign_in(): url_login = 'https://xiaoke.kaikeba.com/example/wordpress/wp-login.php' data_login = {'log': input('请输入你的账号'), 'pwd': input('请输入你的密码'), 'wp-submit': '登录', 'redirect_to': 'https://xiaoke.kaikeba.com/example/wordpress/2019/10/17/%e5%bc%80%e8%af%be%e5%90%a7%e6%97%a0%e6%95%8c%e5%a5%bd%e5%90%83%e7%9a%84%e9%a3%9f%e5%a0%82%e4%b8%80%e5%91%a8%e8%8f%9c%e8%b0%b1/', 'testcookie': '1'} session.post(url_login, headers=headers, data=data_login) # cookie存储。 cookie_dict = requests.utils.dict_from_cookiejar(session.cookies) cookie_str = json.dumps(cookie_dict) f = open('cookie_kaikeba.txt', 'w') f.write(cookie_str) f.close() def write_message(): #发表评论。 url_comment = 'https://xiaoke.kaikeba.com/example/wordpress/wp-comments-post.php' data_comment = { 'comment': input('请输入你要发表的评论:'), 'submit': '发表评论', 'comment_post_ID': '35', 'comment_parent': '0' } return (session.post(url_comment, headers=headers, data=data_comment)) try: session.cookies = cookie_read() except FileNotFoundError: sign_in() session.cookies = cookie_read() num = write_message() if num.status_code == 200: print('成功啦!') else: sign_in() session.cookies = cookie_read() num = write_message()