目录
任务目标
创建模拟网站
创建服务器程序
键盘输入动作
鼠标点击动作
编写爬虫程序
任务目标
- 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 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()
编写爬虫程序
- 创建一个浏览器对象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 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()
运行结果: