python使用cookie、session、selenium实现网站登录(爬取信息)

一、使用cookie

这段代码演示了如何使用Python的urllibhttp.cookiejar模块来实现网站的模拟登录,并在登录后访问需要认证的页面。

# 导入必要的库
import requests
from urllib import request, parse# 1. 导入http.cookiejar模块中的CookieJar类,用于存储和管理Cookie
from http.cookiejar import CookieJar# 2. 导入HTTPCookieProcessor,用于处理HTTP请求中的Cookie
from urllib.request import HTTPCookieProcessor# 设置请求头,模拟浏览器访问
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
}# 创建一个CookieJar对象来存储和管理Cookie
cookiejar = CookieJar()# 创建一个HTTPCookieProcessor处理器,用于处理Cookie
handler = HTTPCookieProcessor(cookiejar)# 使用处理器构建一个opener对象,这个opener会自动处理Cookie
opener = request.build_opener(handler)# 准备登录表单数据
data = {'__VIEWSTATE': 'pm4yVT0tOjA36YHPhIUtUmKXH1wGoOp7OTyI8HH+3PU0Z6E4bohm2CzOOCCQ9w2fxqb7oHLCxM4uHc+BiH5Ul4xTGRDehq9E/QXr22y4HX+qpA4v+j5qfIvc3PU=','__VIEWSTATEGENERATOR': 'B6E3F9D8','txtUser': '',  # 用户名'txtPass': '',       # 密码'btnLogin': ''         # 登录按钮 使用自己的
}# 登录页面的URL
loginurl = "http://210.44.176.97/datajudge/login.aspx"# 创建登录请求对象
# 注意:这里将表单数据编码为URL格式,并转换为字节流
req = request.Request(loginurl, data=parse.urlencode(data).encode("utf-8"), headers=header
)# 发送登录请求,opener会自动保存服务器返回的Cookie
opener.open(req)# 如果上面没有抛出异常,意味着登录成功
# 现在可以访问需要登录后才能查看的页面
url = " " #找到自己的# 创建访问请求对象
reqm = request.Request(url, headers=header)# 发送请求,opener会自动带上之前保存的Cookie
resp = opener.open(reqm)# 打印返回的页面内容
print(resp.read().decode("utf-8"))
  1. Cookie处理机制

    • 使用CookieJar类创建Cookie容器

    • 通过HTTPCookieProcessor创建处理器,自动处理HTTP请求中的Cookie

    • 构建opener对象,后续所有请求都通过这个opener发送,会自动管理Cookie

  2. 模拟登录过程

    • 准备登录表单数据(包括隐藏字段如__VIEWSTATE

    • 发送POST请求到登录页面

    • 服务器返回的Cookie会被自动保存在CookieJar

  3. 访问受保护页面

    • 使用同一个opener发送请求

    • opener会自动带上之前保存的Cookie,证明用户已登录

    • 成功获取需要认证才能访问的页面内容

这种技术常用于:

  • 爬取需要登录的网站数据

  • 自动化测试需要认证的Web应用

  • 模拟用户行为进行网站监控

注意:在实际应用中,应该遵守网站的robots.txt协议和使用条款,不要滥用这种技术。

运行结果:

二、使用session

 

# 导入requests库,用于发送HTTP请求
import requests# 设置请求头,模拟浏览器访问
# 注意:这里的User-Agent伪装成Chrome浏览器
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
}# 准备登录表单数据
# 注意:ASP.NET网站通常会有__VIEWSTATE和__VIEWSTATEGENERATOR等隐藏字段
data = {'__VIEWSTATE': 'pm4yVT0tOjA36YHPhIUtUmKXH1wGoOp7OTyI8HH+3PU0Z6E4bohm2CzOOCCQ9w2fxqb7oHLCxM4uHc+BiH5Ul4xTGRDehq9E/QXr22y4HX+qpA4v+j5qfIvc3PU=','__VIEWSTATEGENERATOR': 'B6E3F9D8','txtUser': '',  # 用户名输入框'txtPass': '',       # 密码输入框'btnLogin': ''         # 登录按钮 自己的
}# 创建一个会话对象
# 会话对象会自动保持Cookie,用于维持登录状态
session = requests.session()# 登录页面的URL
loginurl = "" #自己寻找# 发送POST请求进行登录
# 使用data参数发送表单数据,headers参数设置请求头
# 登录成功后,服务器返回的Cookie会自动保存在session中
session.post(loginurl, data=data, headers=header)# 如果上面没有抛出异常,意味着登录成功
# 现在可以访问需要登录后才能查看的页面
url = ""# 使用同一个session发送GET请求
# session会自动带上之前登录时获得的Cookie
resp = session.get(url, headers=header)# 打印返回的页面内容
# resp.text会自动解码响应内容
print(resp.text)
  1. 请求头设置

    • 设置User-Agent模拟Chrome浏览器访问,避免被服务器识别为爬虫

  2. 表单数据准备

    • __VIEWSTATE__VIEWSTATEGENERATOR是ASP.NET特有的隐藏字段,用于表单状态管理

    • txtUsertxtPass分别对应登录表单的用户名和密码输入框

    • btnLogin是登录按钮的name属性

  3. 会话管理

    • requests.session()创建一个会话对象,该对象会自动处理Cookie

    • 所有通过这个session对象发送的请求都会自动携带相同的Cookie

  4. 登录过程

    • session.post()发送POST请求到登录页面

    • 服务器验证成功后返回的Set-Cookie头会被自动保存

  5. 访问受保护页面

    • 使用同一个session对象发送GET请求

    • 自动携带登录Cookie,证明用户已认证

    • 获取需要登录才能访问的页面内容

 

  1. 会话保持

    • requests.session()创建的会话对象会自动管理Cookie

    • 相比手动处理Cookie更加方便可靠

  2. ASP.NET特性

    • ASP.NET网站通常需要提交__VIEWSTATE等隐藏字段

    • 这些字段的值可以从网页源码或第一次GET请求的响应中获取

  3. 安全性注意事项

    • 代码中包含明文密码,实际应用中应该避免

    • 可以考虑从配置文件或环境变量读取敏感信息

  4. 异常处理

    • 实际应用中应该添加try-except块处理网络异常

    • 可以检查resp.status_code确认请求是否成功

典型应用场景

这种代码通常用于:

  • 爬取需要登录的网站数据

  • 自动化测试Web应用

  • 监控需要认证的网页内容变化

  • 自动化操作Web系统

注意:使用时应遵守目标网站的服务条款和robots.txt规定。

运行结果:

 

三、使用selenium 

# 导入所需模块
import time  # 用于添加等待时间
from selenium import webdriver  # 主模块,用于浏览器自动化
from selenium.webdriver.chrome.service import Service as ChromeService  # Chrome服务
from selenium.webdriver.common.by import By  # 定位元素的方式# 设置ChromeDriver路径
driver_path = r"E:\chromedriver\chromedriver.exe"  # ChromeDriver可执行文件路径# 创建Chrome服务实例
service = ChromeService(executable_path=driver_path)# 初始化Chrome浏览器驱动
driver = webdriver.Chrome(service=service)# 目标登录页面URL
loginurl = ""# 打开登录页面
driver.get(loginurl)# 使用XPath定位用户名输入框并输入用户名
driver.find_element(By.XPATH, "//input[@id='txtUser']").send_keys("18110203023")# 使用XPath定位密码输入框并输入密码
driver.find_element(By.XPATH, "//input[@id='txtPass']").send_keys("范经栋")# 等待3秒,确保页面加载完成(实际应用中建议使用显式等待)
time.sleep(3)# 使用XPath定位登录按钮并点击
driver.find_element(By.XPATH, "//input[@id='btnLogin']").click()# 等待2秒,确保登录完成
time.sleep(2)# 打印当前页面的源代码(登录后的页面)
print(driver.page_source)# 注释掉的代码是之前使用requests库实现的版本,与当前selenium实现做对比
# session.post(loginurl,data=data,headers=header)
# # 意味着登录成功,session对象中已经存储了登录成功地数据
# url="http://210.44.176.97/datajudge/test.aspx"
#
# resp=session.get(url,headers=header)
# print(resp.text)
  1. 初始化浏览器驱动

    • 通过ChromeService指定ChromeDriver路径

    • 创建webdriver.Chrome实例来控制浏览器

  2. 页面导航

    • driver.get(loginurl)打开登录页面

  3. 元素定位与操作

    • 使用XPath定位用户名输入框(id='txtUser')并输入用户名

    • 使用XPath定位密码输入框(id='txtPass')并输入密码

    • 使用XPath定位登录按钮(id='btnLogin')并点击

  4. 等待机制

    • time.sleep(3)在输入密码后等待3秒

    • time.sleep(2)在点击登录后等待2秒

    • (注:实际项目中建议使用selenium的显式等待WebDriverWait)

  5. 结果获取

    • driver.page_source获取当前页面的HTML源码

与requests实现的区别

  1. 模拟方式

    • selenium实际控制浏览器操作,完全模拟用户行为

    • requests直接发送HTTP请求,更轻量但无法处理JavaScript

  2. 验证处理

    • selenium能自动处理图片验证码等需要人工交互的情况

    • requests需要额外处理这类验证

  3. 性能

    • selenium启动浏览器开销大,运行速度慢

    • requests更高效,适合大规模爬取

  4. 应用场景

    • selenium适合需要完全模拟浏览器行为的复杂场景

    • requests适合简单的API调用或静态页面抓取

 运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人基础知识-1

1.六轴机器人中的六轴是什么? 第一轴(J1):底座旋转 控制机器人整体绕垂直轴旋转(左右摆动),决定工作范围的水平方向。 第二轴(J2):下臂前后摆动 驱动机器人的…

将代理连接到 Elasticsearch 使用模型上下文协议

作者:来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松,会怎样?想象一下,你只需简单地问:“显…

Vue 组件 - 动态组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 组件 - 动态组件 目录 动态组件 选项卡页面示例 更简单写法 增加输入框 弥补措施 总结 动态组件 选项卡页面示例 功能:选项卡功能,设置导航点击哪个显示相应页面。 设置三个全局组件&#…

Telnet协议详解:本质与操作逻辑

一、Telnet的本质 1. 协议定位 Telnet是一种基于TCP的明文远程终端控制协议,属于应用层协议。其核心功能是通过网络模拟物理终端,实现对远程主机的命令行控制。 2. 核心特性 网络虚拟终端(NVT):建立统一的字符编码标…

Android 使用CameraX实现预览、拍照、录制视频(Java版)

Android 官方关于相机的介绍如下: https://developer.android.google.cn/media/camera/get-started-with-camera?hlzh_cn 一、开始使用 Android 相机 Android相机一般包含前置摄像头和后置摄像头,使用相机可以开发一系列激动人心的应用,例…

面向对象

一、Scala包 1、基本语法 package 包名 2、Scala 包的三大作用(和 Java 一样) (1)区分相同名字的类 (2)当类很多时,可以很好的管理类 (3)控制访问范围 二、包说明 1、说明…

MySQL多表联查

一、数据库表结构 假设我们有两个表:users 和 orders,users 表存储用户信息,orders 表存储订单信息,一个用户可以有多个订单,通过 user_id 关联两个表。 users 表 字段名数据类型描述user_idINT用户 ID,…

如何迁移AxureCloud到新服务器?

前言 常有朋友遇到在更换服务器时或者本地AxureCloud迁移到服务器上时,如何正确迁移AxureCloud,让原有的原型可以正常访问呢? 事前准备 Navicat:用于迁移数据库。 AxureCloud:和原安装版本一致。 MySQL&#xff1…

CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例

csgo-market/ ├── pom.xml (or build.gradle) └── src/└── main/├── java/│ └── com/│ └── yourcompany/│ └── csgomarket/│ ├── CsgomarketApplication.java # Spring Boot 启动类│ ├── conf…

mac Python多版本第三方库的安装路径

终端查看python版本是 3.12,但是pycharm使用的python版本是 3.9 终端正常安装包以后,pycharm都可以正常使用,但是将 pycharm的python换成 3.12 版本,之前安装的库都没有了 通过终端查看安装库的位置,确实是安装到py…

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…

【VUE3】Pinia

目录 0前言 1 手动添加Pinia 2 创建与使用仓库(Setup Store 组合式) 2.1 创建仓库 2.2 使用仓库数据 2.3 解构响应式数据 3 持久化插件 0前言 官网:Pinia | The intuitive store for Vue.js 1 手动添加Pinia 上手之后,可…

JVM 每个区域分别存储什么数据?

JVM(Java Virtual Machine)的运行时数据区(Runtime Data Areas)被划分为几个不同的区域,每个区域都有其特定的用途和存储的数据类型。以下是 JVM 各个区域存储数据的详细说明: 1. 程序计数器 (Program Cou…

C++中shared_ptr 是线程安全的吗?

在 C 中,shared_ptr 的线程安全性和实现原理可以通过以下方式通俗理解: 1. shared_ptr 是线程安全的吗? 答案:部分安全,需分场景! 安全的操作: 引用计数的增减:多个线程同时复制或销…

什么是 CSSD?

文章目录 一、什么是 CSSD?CSSD 的职责 二、CSSD 是如何工作的?三、CSSD 为什么会重启节点?情况一:网络和存储都断联(失联)情况二:收到其他节点对自己的踢出通知(外部 fencing&#…

arm64平台下linux访问寄存器

通用寄存器 示例:读取寄存器值 // 用户态程序或内核代码中均可使用 unsigned long reg_value; asm volatile ("mov %0, x10" // 将X10的值保存到reg_value变量: "r" (reg_value) ); printk("X10 0x%lx\n", reg_value);示例&…

超级好用的小软件,连接电脑和手机。

将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件,能够将手机摄像头变成电脑的摄像头,通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统,同时兼容iOS和Android手机,操作简单&#x…

Mysql MIC高可用集群搭建

1、介绍 MySQL InnoDB Cluster(MIC)是基于 MySQL Group Replication(MGR)的高可用性解决方案,结合 MySQL Shell 和 MySQL Router,提供自动故障转移和读写分离功能,非常适合生产环境 2、部署 …

PERL开发环境搭建>>Windows,Linux,Mac OS

特点 简单 快速 perl解释器直接对源代码程序解释执行,是一个解释性的语言, 不需要编译器和链接器来运行代码>>速度快 灵活 借鉴了C/C, Basic, Pascal, awk, sed等多种语言, 定位于实用性语言,既具备了脚本语言的所有功能,也添加了高级语言功能 开源.免费 没有&qu…

ubuntu改用户权限

在 Linux 系统中,赋予普通用户 sudo 权限可以让他们执行一些需要 root 权限的命令,而不需要频繁切换到 root 用户。以下是具体步骤: 创建用户(useradd和adduser两种方式) 首先,需要创建一个新的用户。可以使用 adduser 或 usera…