【爬虫】5.4 Selenium 实现用户登录

目录

任务目标

创建模拟网站

创建服务器程序

 键盘输入动作

鼠标点击动作

编写爬虫程序


任务目标

  1. Selenium 查找的 HTML 元素是一个 WebElemen t对象, 这个对象不但可以获取元素的属性值,而且还能执行一 些键盘输入send_keys()鼠标点击click()的动作
  2. 我们设计一个实现用户登录并爬取数据的程序来演示这个过程。

创建模拟网站

模拟登录网站 login.html 如下:

注:login.html 文件要位于 templates 这个目录下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>模拟登录网站</title>
</head>
<body><form id="frm" action="/" method="post"><div>用户<input type="text" name="user"></div><div>密码<input type="password" name="pwd"></div><div><input type="submit" name="login" vaule='登录'></div></form>
</body>
</html>

创建服务器程序

服务器程序 server.py 如下:

import flaskapp = flask.Flask(__name__)@app.route("/", methods=["GET", "POST"])
def login():user = flask.request.values.get("user") if "user" in flask.request.values else ""pwd = flask.request.values.get("pwd") if "pwd" in flask.request.values else ""if user == "xxx" and pwd == "123":return flask.redirect("/show")else:return flask.render_template("login.html")# 注:login.html文件要位于 templates 这个目录下@app.route("/show", methods=["GET", "POST"])
def show():s = "<table border='1'>"s = s + "<tr><td>品牌</td><td>型号</td><td>价格</td></tr>"s = s + "<tr><td>华为</td><td>P9</td><td>3800</td></tr>"s = s + "<tr><td>华为</td><td>P10</td><td>4200</td></tr>"s = s + "<tr><td>苹果</td><td>iPhone6</td><td>5800</td></tr>"s = s + "</table><p>"return sapp.run()

 结果如下:(这里需要手动输入登录)

    


 键盘输入动作

  • 函数clear() 模拟清除element元素中的所有文字
  • 函数 send_keys(string) 模拟键盘在元素中输入字符串string

鼠标点击动作

        很多HTML元素都有鼠标点击动作,例如 <input type="submit"> 提交按钮点击后就提交表单。WebElement使用 click() 函数实现鼠标点击

 模拟登录 程序如下:(这里不需要手动输入登录)

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
try:driver.get("http://127.0.0.1:5000")user = driver.find_element(By.NAME, "user")pwd = driver.find_element(By.NAME, "pwd")time.sleep(0.5)user.send_keys("xxx")time.sleep(0.5)pwd.send_keys("123")time.sleep(2)driver.find_element(By.XPATH, "//input[@type='submit']").click()
except Exception as err:print(err)input("Strike any key to finish...")
driver.close()

编写爬虫程序

  1. 创建一个浏览器对象driver,使用这个driver对象模拟浏览器。
  2. 访问 http://127.0.0.1:5000 网站,获取 <input type="text" name="user">与<input type="password" name="pwd">元素对象,调用send_keys("xxx"), send_keys(" 123 "),模拟用户键盘输入名称"xxx"与密码“123”。
  3. 获取<input type="submit" name="login">按钮对象,执行 click() 点击动作,提交表单。
  4. 服务器接收提交的user与pwd数据,判断是否登录成功,如果登录成功就转"/show"页面显示手机记录。
  5. 爬虫程序爬取数据记录。

爬虫程序 demo.py 如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import timedef login():print(driver.current_url)user = driver.find_element(By.NAME, "user")pwd = driver.find_element(By.NAME, "pwd")login = driver.find_element(By.NAME, "login")user.send_keys("xxx")pwd.send_keys("123")login.click()time.sleep(0.5)def spider():global tds, mark, model, priceprint(driver.current_url)trs = driver.find_elements(By.TAG_NAME, "tr")for i in range(1, len(trs)):tds = trs[i].find_elements(By.TAG_NAME, "td")if len(tds) == 3:mark = tds[0].textmodel = tds[1].textprice = tds[2].textprint("%-16s%-16s%-16s" % (mark, model, price))chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome()
try:driver.get("http://127.0.0.1:5000")login()spider()
except Exception as err:print(err)
driver.close()

运行结果:

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

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

相关文章

Qt画图框架,实现自己的画图框架

前面也讲到Qt提供画图框架&#xff0c;经典MVC模型&#xff0c;也没有什么问题。但Qt仅提供框架性东西&#xff0c;很难落地&#xff0c;很难应用在实际项目当中&#xff0c;一般需要自己捋一遍&#xff0c;这样才能理解好 什么view&#xff0c;canvas都好理解&#xff0c;只要…

Golang内存分配及垃圾回收

为什么需要垃圾回收&#xff1f; 自动释放不需要的对象&#xff0c;让出存储器资源&#xff0c;无需程序员手动执行 Go V1.3之前是标记-清除算法 具体步骤 缺点&#xff1a;程序卡顿、扫描整个heap、数据清除会产生heap碎片 V1.3之后&#xff0c;做了简单的优化 V1.5之后&a…

MySQL索引、事务、与存储引擎

MySQL索引、事务、与存储引擎 一、索引 1.概念 索引是一个排序的列表&#xff0c;包含索引字段的值和其相对应的行数据所在的物理地址2.作用 优点 加快表的查询速度 可以对字段排序缺点 额外占用磁盘空间 更新包含索引的表效率会更慢3.索引工作模式 没有索引的情况下&am…

-1在内存中的存储及打印问题。

首先先看看代码&#xff1a; #include"stdio.h" int main() { char a -1; signed char b -1; unsigned char c -1; printf("a%d b%d c%d", a, b, c); return 0; } 代码很简单&#xff0c;问打印结果是什么&#xff1f; 下面我…

一文了解Python字符串格式化、input语句

目录 &#x1f969;1.1.字符串拼接 &#x1f969;1.2.对字符串格式化 &#x1f969;1.3.字符串精度 &#x1f969;1.4.快速格式化 &#x1f969;1.5.对表达式格式化 &#x1f969;1.6.黑马小练习 &#x1f969;2.1.input语句 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客…

【前端知识】React 基础巩固(十八)——组件化开发(二)

React 基础巩固(十八)——组件化开发&#xff08;二&#xff09; 生命周期 生命周期是一个抽象的概念&#xff0c;在生命周期的整个过程中&#xff0c;分成了很多个阶段 比如装载阶段&#xff08;Mount&#xff09;&#xff0c;组件第一次在 DOM 树中被渲染的过程比如更新过程…

【python】逻辑中断(and or)

今天学习javascript的时候竟然有一个额外收获&#xff1a;逻辑中断。而且我实验了一下&#xff0c;逻辑中断同样适用于python。 0 and 2返回&#xff1a; 0 1 and 2返回&#xff1a; 2 0 and 2返回的是0&#xff0c;而1 and 2返回的是2。就是因为在0那里出现了逻辑中断。 解…

大模型的数据瓶颈应该如何破除?看完这篇文章你就懂了

随着机器学习和深度学习技术的不断发展&#xff0c;大模型已经成为了现代人工智能研究和应用中的重要组成部分。然而&#xff0c;对于大模型而言&#xff0c;数据瓶颈问题仍然是一个亟待解决的挑战。尤其是在数据存量和质量方面&#xff0c;我们需要更加注重其影响&#xff0c;…

【Gradle】Gradle的概述与简单使用

一、概述 1.什么是Gradle&#xff1f; Gradle 是一种构建工具。 Java世界中主要有三大构建工具&#xff1a;Ant、Maven和Gradle。Ant几乎销声匿迹了&#xff0c;常见的就只有Maven和Gradle。 目前市面上Java开发&#xff0c;使用的构建工具基本都是Maven&#xff1b;安卓开…

C语言程序设计——数据在内存中的存储

一、数据类型介绍 1.基本内置类型 char // 字符数据类型 1 B short // 短整型 2 B int // 整型 4 B long // 长整型 4 or 8 B long long //更长的整型 8 B float //单精度浮点型 4 B double //双精…

解决Unity的PostProcess奇怪报错

大家好&#xff0c;我是阿赵。   最近在使用Unity的PostProcess后处理效果的时候&#xff0c;发现了一个问题&#xff0c;下面记录一下这个问题的出现原因和解决办法。 一、出现问题 问题是这样出现的&#xff1a;   在场景里面添加某一个后处理效果后&#xff0c;当这个后…

C# PaddleInference OCR文字识别(只识别)

说明 C# PaddleInference OCR文字识别&#xff08;只识别&#xff09;&#xff0c;没有文字区域检测、文字方向判断 测试图片是文字区域检测裁剪出来、处理过的图片 完整的OCR识别查看 C# PaddleInference OCR识别 学习研究Demo_天天代码码天天的博客-CSDN博客 效果 项目 …