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)
实例:博客园传固定的cookies登陆

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获取, 或通过正则表达式获取

实例:拉勾网登录,待补充

posted on 2019-12-14 15:54  水晶的晶  阅读(38)  评论(0)    收藏  举报