6.Session
用session去自动管理登录后的cookies。
Session可以理解成python中的微型无界面浏览器。
Session保存在服务器端。
一、登录时无验证码,后续操作的界面,依赖于登录后的cookies。
思路:
1.定义 s = requests.session()
2.用s发请求完成登陆 r = s.post(url)
3.后续页面,用s发请求 r = s.get(url), 不需添加cookie=xxx
登陆前/登陆后/发送其他请求后,可以通过print(s.cookies)查看cookies
二、登录时有验证码,跳过登录的验证码。后续操作的界面,依赖于登录后的cookies。
a.获取到固定的cookies。 思路:
1.手动输入验证码登录,fiddler抓包查看登录后的页面(如:编辑页面),查看cookies
2.定义 s
s = requests.session()
print(s.cookies) # 添加前打印,查看s中的cookies
3.将登陆后的cookies添加到s中 (目的:跳过验证码登录,不走登录)
c = requests.cookies.ReqeustsCookieJar() #jar包
c.set(“name1”, “value1”) #把cookies添加到jar包
c.set(“name2”, “value2”)
s.cookies.update(c) #用c更新s,即将cookies添加到session中
print(s.cookies) # 添加后打印,查看s中的cookies
4.后续页面的访问,用s发请求
r = s.get(url, verify=False)
1 #手动登录博客园,抓包获取固定的cookies 2 # coding:utf-8 3 import requests 4 import urllib3 5 urllib3.disable_warnings() 6 7 def getCookies(s): 8 print(s.cookies) 9 c = requests.cookies.RequestsCookieJar() 10 c.set(".CNBlogsCookie", "8E2155D62FCC34F65B9AD6") 11 c.set(".Cnblogs.AspNetCore.Cookies", "CfDJ8DeHXSa1") 12 s.cookies.update(c) 13 print(s.cookies) 14 15 def getHome(s): 16 url = "https://home.cnblogs.com/u/XXXXXX/" 17 r = s.get(url, verify=False) 18 print(r.status_code) 19 print(r.text) 20 21 if __name__ == "__main__": 22 s = requests.session() 23 getCookies(s) 24 getHome(s)
b.自动获取浏览器cookies。 思路:
1.手动输入验证码登录,勾选保持登录,保证下一次打开浏览器,仍是登录状态
2.用selenium登录,加载浏览器缓存(配置文件)
3.访问网站首页,获取cookies
4.把cookies传给s
5.后续用s发请求
1 #手动登陆博客园,自动获取登录后的cookies,用s发请求访问后续接口 2 # coding:utf-8 3 import requests 4 import urllib3 5 urllib3.disable_warnings() 6 from selenium import webdriver 7 import time 8 9 class BoKeYuan(): 10 # selenium加载配置项方法登录,跳过验证码,获取cookies 11 def get_cookies(self): 12 # firefox浏览器配置文件地址 13 profile_directory = r"C:\Users\UserName\AppData\Roaming\Mozilla\Firefox\Profiles\kxvt7ebg.default" 14 # 加载配置 15 profile = webdriver.FirefoxProfile(profile_directory) 16 # 启动浏览器配置 17 driver = webdriver.Firefox(profile) 18 19 driver.get("https://home.cnblogs.com/u/xxxxxx/") 20 time.sleep(3) 21 cookies = driver.get_cookies() # 获取浏览器cookies 22 print("selenium通过加载配置文件,跳过验证码登录,获取的cookies:", cookies) 23 print("\n") 24 time.sleep(1) 25 driver.quit() 26 return cookies 27 28 # 更新获取到的cookies到s,后续接口都用s去发请求 29 def update_cookies(self, s, cookies): 30 print("更新前的cookies:", s.cookies) 31 print("\n") 32 c = requests.cookies.RequestsCookieJar() 33 for i in cookies: 34 c.set(i["name"], i['value']) 35 s.cookies.update(c) 36 print("更新后的cookies", s.cookies, end="\n") 37 print("\n") 38 39 #访问首页 40 def home_page(self, s): 41 url = "https://home.cnblogs.com/u/xxxxxx/" 42 h = { 43 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36" 44 } 45 r = s.get(url, headers=h, verify=False) 46 print(r.text) 47 48 if __name__ == "__main__": 49 bky = BoKeYuan() 50 cookies = bky.get_cookies() 51 s = requests.session() 52 bky.update_cookies(s, cookies) 53 bky.home_page(s)
c.有万能验证码的,用selenium登录
三、Token
1.登录后访问一个登陆后的地址,如编辑页面,请求中没有带上cookie,可能就不是用cookie登录的,可能是用token登录的
2.Token不会保存到本地,是个动态的参数; cookie是保存到本地的
3.App用token比较多,网站用cookie比较多
4.典型的:返回的数据中有token=xxx;下一个请求,带上token参数
5.发请求时,token的位置,参照接口文档或抓包。可放在url中/header中/body中/cookies中
6.csrfToken和token一样,csrfToken可按token传参,csrfToken也可放在cookies中
四、登录时,防止重复提交的情况,头部需要传动态参数
1.按照上述一、二中的方法,执行登录脚本仍然不成功时,抓包对比
2.若访问登录地址后,抓包得到的头部中含动态参数,则执行登录脚本时,需要在headers中传动态参数
(用s.headers.update(h)更新session之后,后续用s.send()发的请求,由于s中已经带上了头部,因此 不用传参 headers=h)
注:动态参数若在html中,可通过bs4获取, 或通过正则表达式获取
实例:拉勾网登录,待补充
浙公网安备 33010602011771号