【爬虫】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 flask

app = 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 s


app.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 time

driver = 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 time


def 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, price
    print(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].text
            model = tds[1].text
            price = tds[2].text
            print("%-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()

运行结果:


下一篇文章:5.5 Selenium 爬取Ajax网页数据 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值