Selenium-- 浏览器上的按键精灵
Selenium 是一个 web 的自动化测试工具, 最初是为网站自动化测试而开发的, 类型像我们玩游戏用的按键精灵, 可以按指定的命令自动操作, 不同是 Selenium 可以直接运行在浏览器上, 它支持所有主流的浏览器 (包括无界面的浏览器).
Selenium 可以根据我们的指令, 让浏览器自动加载页面, 获取需要的数据, 甚至页面截屏, 或者判断网站上某些动作是否发生.
Selenium 自己不带浏览器, 不支持浏览器的功能, 它需要与第三方浏览器结合在一起才能使用. 但是我们有时候需要让它内嵌在代码中运行, 所以我们可以用 Headless Chrome 的工具代替真实的浏览器.
用法见前篇文章: https://www.cnblogs.com/liangmingshen/p/9989049.html
1. 安装
pip 用命令安装: pip install selenium
2. 快速入门
Selenium 库里有个叫 WebDriver 的 API.
WebDriver 有点儿像可以加载网站的浏览器, 但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素, 与页面上的元素进行交互 (发送文本, 点击等), 以及执行其他动作来运行网络爬虫.
- # 导入 webdriver
- from selenium import webdriver
- # 导入 Chrome
- from selenium.webdriver.Chrome.options import Options
- # 要想调用键盘按键操作需要引入 keys 包
- from selenium.webdriver.common.keys import Keys
- # 设置 Chrome 无头浏览器参数
- chrome_options = Options()
- chrome_options.add_argument('--headless')
- chrome_options.add_argument('--disable-gpu')
- driver = webdriver.Chrome(chrome_options=chrome_options)
- driver.get("http://www.baidu.com/")
- # 获取页面名为 wrapper 的 id 标签的文本内容
- data = driver.find_element_by_id("wrapper").text
- # 打印数据内容
- print(data)# 打印页面标题 "百度一下, 你就知道"
- print(driver.title)
- # 生成当前页面快照并保存
- driver.save_screenshot("baidu.png")
- # id="kw" 是百度搜索输入框, 输入字符串 "淘宝"
- driver.find_element_by_id("kw").send_keys(u"淘宝")
- # id="su" 是百度搜索按钮, click() 是模拟点击
- driver.find_element_by_id("su").click()
- # 获取新的页面快照
- driver.save_screenshot("淘宝. png")
- # 打印网页渲染后的源代码
- print(river.page_source)
- # 获取当前页面 Cookie
- print(driver.get_cookies())
- # ctrl+a 全选输入框内容
- driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
- # ctrl+x 剪切输入框内容
- driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
- # 输入框重新输入内容
- driver.find_element_by_id("kw").send_keys("itcast")
- # 模拟 Enter 回车键
- driver.find_element_by_id("su").send_keys(Keys.RETURN)
- # 清除输入框内容
- driver.find_element_by_id("kw").clear()
- # 生成新的页面快照
- driver.save_screenshot("itcast.png")
- # 获取当前 url
- print(driver.current_url)
- # 关闭当前页面, 如果只有一个页面, 会关闭浏览器
- # driver.close()
- # 关闭浏览器
- driver.quit()
3. 获取单个节点的方法
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_CSS_selector
示例:
Selenium 的 WebDriver 提供了各种方法来寻找元素, 假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
获取节点方法如下
- # 获取 id 标签值
- element = driver.find_element_by_id("passwd-id")
- # 获取 name 标签值
- element = driver.find_element_by_name("user-name")
- # 获取标签名值
- element = driver.find_elements_by_tag_name("input")
- # 也可以通过 XPath 来匹配
- element = driver.find_element_by_xpath("//input[@id='passwd-id']")
Selenium 还提供了通用方法 find_element(), 它需要传入两个参数: 查找方式 By 和值.
实际上, 它就是 find_element_by_id() 这种方法的通用函数版本, 比如 find_element_by_id(id) 就等价于 find_element(By.ID, id), 二者得到的结果完全一致.
示例:
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- browser = webdriver.Chrome()
- browser.get('https://www.taobao.com')
- input_first = browser.find_element(By.ID, 'q')
- print(input_first)
- browser.close()
实际上, 这种查找方式的功能和上面列举的查找函数完全一致, 不过参数更加灵活.
4. 获取多个节点
如果查找的目标在网页中只有一个, 那么完全可以用 find_element() 方法. 但如果有多个节点, 再用 find_element() 方法查找, 就只能得到第一个节点了. 如果要查找所有满足条件的节点, 需要用 find_elements() 这样的方法.
注意, 在这个方法的名称中, element 多了一个 s, 注意区分.
比如, 要查找淘宝左侧导航条的所有条目, 如图 7-3 所示.
可以这样来实现:
- from selenium import webdriver
- browser = webdriver.Chrome()
- browser.get('https://www.taobao.com')
- lis = browser.find_elements_by_css_selector('.service-bd li')
- print(lis)
- browser.close()
来源: https://www.cnblogs.com/liangmingshen/p/9990622.html