一.网站模拟登陆的原理是什么 ?
session与cookie的区别
http协议是无状态的协议,是一次性的请求,访问后连接就断开了
既然请求之间是没联系的,那网站如何知道两个请求是否是同一个用户访问的?
原理:1)服务器在用户登陆成功后,会给用户返回一段字符串sessionid
-
够复杂,无法伪造
-
cookie在http协议中就是一段文本信息,写在http协议的headers中
2)服务器中维护一个sessionid 与 用户的映射关系(字典)
3)浏览器能解析这些值,并把这些信息保存在本地文件中.这就是缓存,在每次请求都自动带上这个sessionid

session是由服务器维护,通过set-cookie交给浏览器
cookie是浏览器取到服务器传来的值,并保存在本地,并在每次请求都带上这些值,供服务器做逻辑判断的.至此,服务器就具有了识别用户的功能
重点:这就是模拟登陆的原理,只要requests请求的时候带上cookie,那么服务器就认为你是登陆的,就能给你返回登陆后的数据 那么如何拿到cookie呢方法1:自动携带cookie
session = requests.session()#假设以下这个是登陆请求res = session.post('http://127.0.0.1/index',data={})#假设这个页面是需要登陆后才能访问,使用了这种方式后,#不需要在get请求里面在携带cookie,而是自动携带了res1 = session.get('http://127.0.0.1/order')
以上这种方式只在程序运行中有效
方法2:将cookie保存到文件中并从文件中读取cookie
import picklesession = requests.session()res = session.post(url, data=post_data, headers=headers)with open("douban.cookie", "wb") as f: pickle.dump(res.cookies, f) #读取文件中cookies with open("douban.cookie", "rb") as f: cookies = pickle.load(f)html = requests.get("https://www.douban.com/", cookies=cookies).text
方法3:使用selenium来完成模拟登陆
import timeimport requestsfrom selenium import webdriverurl = "https://www.douban.com/"browser = webdriver.Chrome(executable_path="chromedriver_win32/chromedriver.exe")def login(): #通过selenium模拟登录都豆瓣 username = "18782902568" password = "admin123" browser.get(url) time.sleep(3) #针对的特殊处理 browser.switch_to.frame(browser.find_element_by_tag_name("iframe")) login_ele = browser.find_element_by_xpath("//li[@class='account-tab-account']") login_ele.click() username_ele = browser.find_element_by_xpath("//input[@id='username']") password_ele = browser.find_element_by_xpath("//input[@id='password']") username_ele.send_keys(username) password_ele.send_keys(password) submit_btn = browser.find_element_by_xpath("//a[@class='btn btn-account btn-active']") submit_btn.click() time.sleep(10) cookies = browser.get_cookies() # 重点 cookie_dict = {} for item in cookies: cookie_dict[item["name"]] = item["value"] res = requests.get(url, cookies=cookie_dict) if "bobby_liyao" in res.text: print("已经登录")if __name__ == "__main__": login()
本文由 mdnice 多平台发布