cookie登录_selenium登录163邮箱,得到cookie,使用requests请求

1.场景

很多时候登录操作是比较复杂的,因为存在各种反爆破操作,以及为了安全性提交数据都会存在加密。如果要完全模拟代码去实现登录操作是比较复杂,并且该网站后续更新了登录安全相关功能,那么登录的模拟操作又得修改。但是通过selenium模拟人为登录的操作是永远不会过时。因此一个好得方案就是通过selenium模拟登录,然后拿到可用得Cookie通过requests进行后续得模拟请求。

0158edde57b5242fed4855c380b48963.png

2.实现代码

import time, requestsfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()driver.get('https://mail.163.com/')WebDriverWait(driver, 15).until(  # 显示等待,直到页面出现某个元素    EC.presence_of_element_located((By.ID, "normalLoginTab")))# 因为登录位置处于iframe中,所以要切换进去driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@id,'x-URS-iframe')]"))email = driver.find_element_by_name('email')password = driver.find_element_by_name('password')login = driver.find_element_by_id('dologin')email.clear()password.clear()email.send_keys('admin')password.send_keys('admin')login.click()driver.switch_to.default_content()  # 切回默认WebDriverWait(driver, 15).until(  # 显示等待,直到页面出现某个元素    EC.presence_of_element_located((By.ID, "_mail_tabitem_0_116text")))driver.find_element_by_xpath('//*[@class="nui-tree-item-text" and @]').click()time.sleep(1)  # 等一下,看看点击收件箱效果# 通过执行js语法得到cookie值,为啥不用:driver.get_cookies(),是因为得到的结果不全# 这里花了些功夫才想到可以通过js获取cookie,还是太相信driver.get_cookies()这个API了# 经验就是一条路不通,就要换条路了cookies = driver.execute_script('return document.cookie')driver.quit()  # 退出浏览器sid_flag = 'Coremail.sid='  # sid起始标识if (start := cookies.find(sid_flag)) == -1:    print('cookies:', cookies)    exit(0)start += len(sid_flag)if (end := cookies.find(';', start)) == -1:    sid = cookies[start:]  # sid在结尾else:    sid = cookies[start:end]  # sid在中间# 下面只是拿获取收件箱的请求结果,其他请求自行抓取分析url = 'https://mail.163.com/js6/s?sid=' + sid + '&func=mbox:listMessages&mbox_folder_enter=1'data = {'var': '<?xml version="1.0"?>1datetrue200falsetoptruetrue'}headers = {    'Accept': 'text/javascript',    'Accept-Language': 'zh-CN,zh;q=0.9',    'Connection': 'keep-alive',    'Content-Type': 'application/x-www-form-urlencoded',    'Sec-Fetch-Site': 'same-origin',    'Sec-Fetch-Mode': 'cors',    'Accept-Encoding': 'gzip, deflate, br',    'Host': 'mail.163.com',    'Origin': "https://mail.163.com",    'Referer': "https://mail.163.com/js6/main.jsp?sid=" + sid + "&df=mail163_letter",    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',    'Cookie': cookies}resp = requests.post(url, data, headers=headers).textprint(resp)

3.遇到问题

1. 登录元素在iframe里面导致一开始无法定位元素,切换到iframe里面即可

2. 使用driver.get_cookies()获取的cookie总是无法满足requests后续请求,最终发现该方法返回的cookie比真实的要少。最后曲线救国,通过selenium执行js方法获取cookie

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,如果你想使用requests库维持会话并使用selenium获取cookie进行请求请求头应该保持一致。具体来说,你需要selenium获取cookie添加到requests的会话中,并且在每个请求中包含与selenium相同的headers。 要获取selenium的headers,你可以使用WebDriver的execute_script方法执行JavaScript代码,获取当前页面的headers。下面是一个示例: ```python from selenium import webdriver # 创建Selenium WebDriver实例 driver = webdriver.Chrome() # 打开一个网页 driver.get("https://example.com") # 执行JavaScript代码来获取headers headers = driver.execute_script("return Object.assign({}, window.navigator, {cookie: document.cookie})") # 打印headers print(headers) # 关闭WebDriver driver.quit() ``` 在这个示例中,我们使用`execute_script`方法执行JavaScript代码来获取当前页面的headers。返回的headers是一个包含cookie和其他navigator属性的字典。 获取了headers后,你可以将其用于requests库的会话中,例如: ```python import requests # 创建requests会话 session = requests.Session() # 设置requests会话的headers和cookies session.headers.update(headers) session.cookies.update(driver.get_cookies()) # 使用requests进行请求 response = session.get("https://example.com") # 打印响应内容 print(response.content) ``` 在这个示例中,我们更新了requests会话的headers和cookies,然后使用requests发送了一个GET请求。 总结起来,如果想要使用selenium获取cookie,并使用requests库维持会话请求需要selenium获取的headers和cookie分别设置到requests会话中的headers和cookies中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值