100天精通Python(实用脚本篇)——第117天:基于selenium实现反反爬策略之代码输入账号信息登录网站

文章目录

  • 专栏导读
  • 1. 前言
  • 2. 实现步骤
  • 3. 基础补充
  • 4. 代码实战
    • 4.1 创建连接
    • 4.2 添加请求头伪装浏览器
    • 4.3 隐藏浏览器指纹
    • 4.4 最大化窗口
    • 4.5 启动网页
    • 4.6 点击密码登录
    • 4.7 输入账号密码
    • 4.8 点击登录按钮
    • 4.9 完整代码
    • 4.10 GIF动图展示
  • 五、总结

专栏导读

🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

1. 前言

上文我们学习了通过cookie登录网站,接下来我们来学用代码输入账号信息登录网,测试网站某宝。

2. 实现步骤

下面是某宝的登录界面,接下来我们需要实现的步骤是:

  • 1、打开网页
  • 2、输入账号信息
  • 3、输入密码信息
  • 4、点击 “登录” 按钮

在这里插入图片描述

3. 基础补充

由于某宝的反爬技术很高超,这里我们需要用到网页元素定位操作隐藏浏览器指纹,还不会的小伙伴学习一下专栏文章:

  • 100天精通Python(爬虫篇)——第47天:selenium自动化操作浏览器(基础+代码实战)
  • 100天精通Python(实用脚本篇)——第115天:基于selenium实现反反爬策略之隐藏浏览器指纹特征

4. 代码实战

4.1 创建连接

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 1. 创建连接
# 创建ChromeOptions对象,用于配置Chrome浏览器的选项
chrome_options = webdriver.ChromeOptions()
# 添加启动参数,'--disable-gpu'参数用于禁用GPU加速,适用于部分平台上的兼容性问题
chrome_options.add_argument('--disable-gpu')

4.2 添加请求头伪装浏览器

通过添加请求头伪装成正常的浏览器信息:

# 2. 添加请求头伪装浏览器
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)

4.3 隐藏浏览器指纹

执行 stealth.min.js 文件进行隐藏浏览器指纹特征:

# 3. 执行 `stealth.min.js` 文件进行隐藏浏览器指纹
with open('stealth.min.js') as f:
    js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})

4.4 最大化窗口

为了方便大家看登录操作,设置浏览器 全屏:

# 4. 最大化浏览器窗口
driver.maximize_window()

4.5 启动网页

# 5. 发送请求,打开网页
driver.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)

4.6 点击密码登录

1、有时候打开某宝的登录界面,它想让我们扫码登录,这时候我们就需要点击密码登录:

在这里插入图片描述
2、这个标签有个js,本想通过执行js点击元素,结果发现执行不成功也不报错(原因未知大家可以自行尝试下),所以选择定位xpath:

在这里插入图片描述

元素的xpath地址:

//div[@class='login-blocks qrcode-bottom-links']/a[1]

3、通过find_element方法定位元素的xpath,由于这个界面是有几率触发,所以写一个异常捕获防止报错,通过click()方法点击元素:

# 6. 点击账号密码登录
try:
    # 找到登录按钮元素
    button = driver.find_element(by=By.XPATH, value="//div[@class='login-blocks qrcode-bottom-links']/a[1]")
    # 点击登录按钮
    button.click()
except:
    pass

4.7 输入账号密码

注意事项:有ID找ID(ID是唯一的),没ID找其他标签

1、确定账号、密码输入框的标签信息:

在这里插入图片描述

账号框ID为:

fm-login-id

密码框ID为:

fm-login-password

2、通过find_element方法定位文本框,通过send_keys方法输入账号信息:

# 7. 输入账号密码
username_input = driver.find_element(by=By.ID, value="fm-login-id") # 定位账号框
username_input.send_keys("your_username")  # 输入账号信息(这里自行替换)

password_input  = driver.find_element(by=By.ID, value="fm-login-password") # 定位密码框
password_input .send_keys("your_username")  # 输入密码信息(这里自行替换)

4.8 点击登录按钮

1、刚开始试过,用这个登录按钮classes ID定位,但是代码无法定位成功,所以还是选择xpath定位:

在这里插入图片描述
登录按钮xpath地址:

//button[@class='fm-button fm-submit password-login']

2、通过find_element方法定位xpath,通过click()方法点击元素:

# 8. 点击登录按钮元素
login_button = driver.find_element(by=By.XPATH, value="//button[@class='fm-button fm-submit password-login']")
# 点击登录按钮
login_button.click()

4.9 完整代码

下面是完整登录代码,需要替换自己的账号密码

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 1. 创建链接
# 创建ChromeOptions对象,用于配置Chrome浏览器的选项
chrome_options = webdriver.ChromeOptions()
# 添加启动参数,'--disable-gpu'参数用于禁用GPU加速,适用于部分平台上的兼容性问题
chrome_options.add_argument('--disable-gpu')

# 2. 添加请求头伪装浏览器
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)

# 3. 执行 `stealth.min.js` 文件进行隐藏浏览器指纹
with open('stealth.min.js') as f:
    js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})

# 4. 最大化浏览器窗口
driver.maximize_window()

# 5. 发送请求,打开网页
driver.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)

# 6. 点击账号密码登录
try:
    # 找到登录按钮元素
    button = driver.find_element(by=By.XPATH, value="//div[@class='login-blocks qrcode-bottom-links']/a[1]")
    # 点击登录按钮
    button.click()
except:
    pass

# 7. 输入账号密码
username_input = driver.find_element(by=By.ID, value="fm-login-id") # 定位账号框
username_input.send_keys("your_username")  # 输入账号信息(这里自行替换)

password_input  = driver.find_element(by=By.ID, value="fm-login-password") # 定位密码框
password_input .send_keys("your_username")  # 输入密码信息(这里自行替换)

# 8. 点击登录按钮元素
login_button = driver.find_element(by=By.XPATH, value="//button[@class='fm-button fm-submit password-login']")
# 点击登录按钮
login_button.click()

# 9. 接下来就可以进行网页信息的解析了,自行编写。。。

4.10 GIF动图展示

在这里插入图片描述

五、总结

爬虫是一个很玄学的技术,本文中4.6执行js和4.8元素定位操作明明是正确的却还是要报错,就不得不换一种网页元素定位方法,所以大家遇到报错不要心慌,不妨换一个操作进行尝试,我们下期见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

U盘拒绝访问?快速恢复数据的实用方案!

当您尝试访问U盘时,突然遇到“U盘拒绝访问”的提示,这无疑是一个令人头疼的问题。这不仅意味着您无法读取或写入U盘中的数据,还可能意味着重要文件的安全受到威胁。本文将深入探讨U盘拒绝访问的原因,并为您提供至少两种实用的数据…

推荐一个 Obsidian 的 ChatGPT 插件

源码地址:https://github.com/nhaouari/obsidian-textgenerator-plugin Text Generator 是目前我使用过的最好的 Obsidian 中的 ChatGPT 功能插件。它旨在智能生成内容,以便轻松记笔记。它不仅可以在 Obsidian 中直接使用 ChatGPT,还提供了优…

【教程】 iOS混淆加固原理篇

目录 摘要 引言 正文 1. 加固的缘由 2. 编译过程 3. 加固类型 1) 字符串混淆 2) 类名、方法名混淆 3) 程序结构混淆加密 4) 反调试、反注入等一些主动保护策略 4. 逆向工具 5. OLLVM 6. IPA guard 7. 代码虚拟化 总结 摘要 本文介绍了iOS应用程序混淆加固的缘由…

K线实战分析系列之十一:行情力量不足——平头形态

K线实战分析系列之十一:行情力量不足——平头形态 一、平头形态二、不同形态与平头形态的叠加三、总结平头形态 一、平头形态 前一根K线具有较长的实体,后一根K线的实体比较小,无论是多头还是空头的力量到第二根K线都被瓦解了多头上攻&#…

【小沐学QT】QT学习之Web控件的使用

文章目录 1、简介1.1 Qt简介1.2 Qt下载和安装1.3 Qt快捷键1.4 Qt帮助 2、QtWeb控件2.1 测试代码1(QApplication)2.2 测试代码2(QApplicationQWidget)2.3 测试代码3(QApplicationQMainWindow)2.4 测试代码4&…

python实现线下缓存最优算法

对于现代计算机为了加快数据存储速度,一般会采用多级缓存的方法,以最简单的二级缓存来说,数据会存放在两个地方,一个地方就是存在内存当中,另一个存放的地方就是存放在硬盘当中,但是这两个地方数据读取的速…

中科大计网学习记录笔记(十五):可靠数据传输的原理

前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…

编码后的字符串lua

-- 长字符串 local long_string "你好你好你好你好你好你好你好你好" local encoded_string "" for i 1, #long_string do local char_code string.byte (long_string, i) encoded_string encoded_string .. char_code .. "," end encoded_…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

springboot项目打成含crud操作的sdk集成到springboot启动引擎项目

一 sdk配置操作 1.1 结构 sdk项目目录中只有基础的service类以及mybatis操作数据库的相关文件,service类中包含查询数据库的方法。 说明: 1.2 sdk的pom打包配置 作为公共项目打成jar供其他项目引用,注意被引入的项目不能使用默认的maven…

python 3.11中安装sympy(符号工具包)

1.python环境: 2.安装遇到问题: 其中一台Win10系统上: … 另一台Win10系统上: 3.升级pip cmd命令行中,执行如下命令: python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中&…

NotePad2轻便够用的文本编辑器

下载方式: 360软件管家里就可以安装,非常的方便。 打开后,界面如下: 可以拖拽打开文本,和notepad的功能差不多,可以平行替代。

苹果分拣检测YOLOV8NANO

苹果分拣,可以检测成熟、切片、损坏、不成熟四种类型,YOLOV8NANO,训练得到PT模型,然后转换成ONNX,OPENCV的DNN调用,支持C,PYTHON 苹果分拣检测YOLOV8NANO,检测四种类型苹果

电子书推荐|IT 基础架构团队的 K8s 管理(含最新性能评测)

越来越多的企业采用 Kubernetes 支持应用的快速开发与交付,Kubernetes 的部署与管理任务也逐渐向 IT 基础架构团队倾斜。尤其是对于习惯了传统虚拟化环境的基础架构工程师,容器环境的管理方式往往会带来诸多困扰: Kubernetes 使用门槛高&…

5.2 Ajax 数据爬取实战

目录 1. 实战内容 2、Ajax 分析 3、爬取内容 4、存入MySQL 数据库 4.1 创建相关表 4.2 数据插入表中 5、总代码与结果 1. 实战内容 爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分,并将这些内容存入MySQL数据库中。 2、…

提高SQL查询效率1——验证索引的有效性

在大数据量的SQL表中,往往会出现一些查询效率低的问题,耗时,如果解决这里问题呢?本文主要探索索引在提高SQL效率的有效性。 目录 1、创建数据表 2、为建立索引之前,查看执行效率 3、给Name建立索引 4、查看索引 1、…

AI书籍推荐 | 使用 ChatGPT MILLIONAIRE 指南走向财务自由

本文中的链接若打不开,您可能需要科学上网哦! 跳进数字时代的大潮,想把握住人工智能带来的财富机会? 那就别眨眼!一本名为《ChatGPT MILLIONAIRE》的书籍,你可以了解一下。从Chat GPT精通系列来袭&#x…

office word保存pdf高质量设置

1 采用第三方pdf功能生成 分辨率越大质量越好

flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

flutter端创建MethodChannel类 import package:flutter/services.dart;//MethodChannel const methodChannel const MethodChannel(com.flutter.demo.MethodChannel);class FlutterMethodChannel {/** MethodChannel flutter给原生发信息* 在方法通道上调用方法invokeMethod*…