目录
任务目标
创建模拟网站
创建服务器程序
键盘输入动作
鼠标点击动作
编写爬虫程序
任务目标
- Selenium 查找的 HTML 元素是一个 WebElemen t对象, 这个对象不但可以获取元素的属性值,而且还能执行一 些键盘输入send_keys()与鼠标点击click()的动作
- 我们设计一个实现用户登录并爬取数据的程序来演示这个过程。
创建模拟网站
模拟登录网站 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()
编写爬虫程序
- 创建一个浏览器对象driver,使用这个driver对象模拟浏览器。
- 访问 http://127.0.0.1:5000 网站,获取 <input type="text" name="user">与<input type="password" name="pwd">元素对象,调用send_keys("xxx"), send_keys(" 123 "),模拟用户键盘输入名称"xxx"与密码“123”。
- 获取<input type="submit" name="login">按钮对象,执行 click() 点击动作,提交表单。
- 服务器接收提交的user与pwd数据,判断是否登录成功,如果登录成功就转"/show"页面显示手机记录。
- 爬虫程序爬取数据记录。
爬虫程序 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()
运行结果: