赞
踩
讲解selenium之前,为了让读者更明白selenium,我会贴一些网站的图片和代码。
但是,【注意!!!】
【以下网站图片和代码仅供展示!!如果大家需要练习,请自己再找别的网站练习。】
【尤其是政府网站,千万不能碰哦!】
sudo pip3 install selenium
python -m pip install selenium
以下三种方式安装一组即可
说明
下载地址
chromedriver版本要和浏览器大版本对应,否则会闪退
Windows安装
Ubuntu安装
命令实现
tar -zxvf xxx.tar.gz
sudo cp chromedriver /usr/bin
sudo chmod +x /usr/bin/chromedriver
Windows 和 Ubuntu 验证 - 终端
实例代码 - 打开Chrome浏览器,并打开百度首页
# 导入selenium的webdriver接口
from selenium import webdriver
# 1.创建浏览器对象 - 此时浏览器打开
browser = webdriver.Chrome()
# 2.输入百度地址并确认
browser.get('http://www.baidu.com/')
# 3.关闭浏览器
browser.quit()
示例代码 - 打开被堵,输入关键字搜索,查看结果页
from selenium import webdriver
# 1、创建浏览器对象 - 打开浏览器
driver = webdriver.Chrome()
# 2、打开百度首页
driver.get('http://www.baidu.com/')
# 3、找到搜索框节点,并发送搜索关键字
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('清华大学')
# 4、找到 百度一下 按钮,并点击
driver.find_element_by_xpath('//*[@id="su"]').click()
find_element_by_xpath可以直接在网页中复制xpath获取
详细用法:https://blog.csdn.net/weixin_36279318/article/details/79475388
# 假设说网页非最后一页的“下一页”的源代码为class='pn-next'
# 网页最后一页的“下一页”的源代码为class='pn-next disabled'
browser.page_source.find('pn-next disabled') == -1 # 说明不是最后一页
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id() | find_elements_by_id() | 通过元素id定位 |
find_element_by_name() | find_elements_by_name() | 通过元素name定位 |
find_element_by_class_name() | find_elements_by_class_name() | 通过类名进行定位 |
find_element_by_xpath() | find_elements_by_xpath() | 通过xpath表达式定位 |
find_element_by_link_text() | find_elements_by_link_text() | 通过完整超链接定位 |
find_element_by_partical_link_text() | find_elements_by_partical_link_text() | 通过部分链接定位 |
find_element_by_tag_name() | find_elements_by_tag_name() | 通过标签定位 |
find_element_by_css_selector() | find_elements_by_css_selector() | 通过css选择器进行定位 |
实例演示
<!--假设页面源代码如下:-->
<html>
<head>
<body link="#0000cc">
<a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
<form id="form" class="fm" name="f" action="/s">
<span class="soutu-btn"></span>
<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
查找元素:
# 通过id定位
driver.find_element_by_id("kw")
# 通过name定位
driver.find_element_by_name("wd")
# 通过class name定位
driver.find_element_by_class_name("s_ipt")
# 通过tag name定位
driver.find_element_by_tag_name("input")
# 通过xpath定位,xpath定位有N种写法,这里列几个常用写法
driver.find_element_by_xpath("//*[@id='kw']")
driver.find_element_by_xpath("//*[@name='wd']")
driver.find_element_by_xpath("//input[@class='s_ipt']")
driver.find_element_by_xpath("/html/body/form/span/input")
driver.find_element_by_xpath("//span[@class='soutu-btn']/input")
driver.find_element_by_xpath("//form[@id='form']/span/input")
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")
# 通过css定位,css定位有N种写法,这里列几个常用写法
driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("[name=wd]")
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector("html > body > form > span > input")
driver.find_element_by_css_selector("span.soutu-btn> input#kw")
driver.find_element_by_css_selector("form#form > span > input")
--------------------------------------------------------------------------
# 假设页面上有一组文本链接:
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
--------------------------------------------------------------------------
# 通过link text定位
driver.find_element_by_link_text("新闻")
driver.find_element_by_link_text("hao123")
# 通过partial link text定位
driver.find_element_by_partial_link_text("新")
driver.find_element_by_partial_link_text("hao")
driver.find_element_by_partial_link_text("123")
思路
重要
爬取一页数据
爬取多页数据:
设置无界面模式(Chrome | Firefox)
不会打开网页,但是一样能获取到数据。
节点xpath
从爬取到的结果看,格式并不统一。
所以只能找他们的xpath进行获取数据
Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。
常用的键盘操作如下:
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.BACK_SPACE) | 输入删除键(BackSpace) |
send_keys(Keys.SPACE) | 输入空格键(Space) |
send_keys(Keys.TAB) | 输入制表键(Tab) |
send_keys(Keys.ESCAPE) | 输入回退键(Esc) |
send_keys(Keys.ENTER) | 输入回车键(Enter) |
组合键的使用
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.CONTROL, ‘a’) | 全选(Ctrl+A) |
send_keys(Keys.CONTROL, ‘c’) | 复制(Ctrl+C) |
send_keys(Keys.CONTROL, ‘x’) | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL, ‘v’) | 粘贴(Ctrl+V) |
send_keys(Keys.F1…Fn) | 键盘 F1…Fn |
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
方法 | 说明 |
---|---|
ActionChains(driver) | 构造ActionChains对象 |
context_click() | 执行鼠标悬停操作 |
move_to_element(above) | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element(above) | 执行鼠标悬停操作 |
context_click() | 用于模拟鼠标右键操作, 在调用时需要指定元素定位 |
perform() | 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作 |
from selenium.webdriver import ActionChains
ActionChains(browser)
move_to_element(node)
perform()
ActionChains(browser).move_to_element(node).perform()
from selenium import webdriver
#0.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("https://www.baidu.com")
#2.定位到要悬停的元素
element= driver.find_element_by_link_text("设置")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
#找到链接
elem1=driver.find_element_by_link_text("搜索设置")
elem1.click()
#通过元素选择器找到id=sh_2,并点击设置
elem2=driver.find_element_by_id("sh_1")
elem2.click()
#保存设置
elem3=driver.find_element_by_class_name("prefpanelgo")
elem3.click()
使用网站类型
应对方案(browser.switch_to.window())
all_handles = browser.window_handles
browser.switch_to.window(all_handles[1])
【注意!!】以上图片仅供展示,请勿爬取。
【注意!!】以下代码仅供展示,请大家换个网站练习。
-- mysql 存储数据
create database mzbdb charset utf8;
use mzbdb;
create table mzbtab(
name varchar(30),
code varchar(20)
)charset=utf8;
【注意!!】以下代码仅供展示,请大家换个网站练习。
–
以QQ邮箱为例:
从网页源码中可以看到,html中包含了html,此时用driver.find_element_by_xxx()查找元素,找的实际上是外层html中的元素。所以我们需切换到iframe中,才能找到里层的html元素。
豆瓣网登录
selenium登录豆瓣网思路
selenium登录QQ邮箱
思路
方法 | 说明 |
---|---|
webdriver.set_window_size() | 设置浏览器的大小 |
webdriver.back() | 控制浏览器后退 |
webdriver.forward() | 控制浏览器前进 |
webdriver.refresh() | 刷新当前页面 |
webdriver.clear() | 清除文本 |
webdriver.send_keys(value) | 模拟按键输入 |
webdriver.click() | 单击元素 |
webdriver.submit() | 用于提交表单 |
webdriver.get_attribute(name) | 获取元素属性值 |
webdriver.is_displayed() | 设置该元素是否用户可见 |
webdriver.size | 返回元素的尺寸 |
webdriver.text | 获取元素的文本 |
from selenium import webdriver
from time import sleep
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")
sleep(3)
#3.刷新浏览器
browser.refresh()
#4.设置浏览器的大小
browser.set_window_size(1400,800)
#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()
element=browser.find_element_by_link_text("“下团组”时间")
element.click()
获取断言信息
不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。
属性 | 说明 |
---|---|
title | 用于获得当前页面的标题 |
current_url | 用户获得当前页面的URL |
text | 获取搜索条目的文本信息 |
实例演示
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("https://www.baidu.com")
print('Before search================')
# 打印当前页面title
title = driver.title
print(title) # 百度一下,你就知道
# 打印当前页面URL
now_url = driver.current_url
print(now_url) # https://www.baidu.com/
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印当前页面title
title = driver.title
print(title) # selenium_百度搜索
# 打印当前页面URL
now_url = driver.current_url
print(now_url) # https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=0&rsv_sug3=8&inputT=758&rsv_sug4=759
# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user) # 百度为您找到相关结果约7,170,000个
#关闭所有窗口
driver.quit()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。