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

session与cookie的区别
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 pickle
session = 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 time
import requests
from selenium import webdriver
url = "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)
#针对<iframe>的特殊处理
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()
作者介绍

公众号:uncle39py
V1