公众号:uncle39py

V1

2022/09/07阅读:9主题:默认主题

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()

分类:

后端

标签:

Python

作者介绍

公众号:uncle39py
V1