爬虫系列(十二) selenium的基本使用
一、selenium 简介
随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载
对于爬取这些网站,一般有两种思路:
- 分析 Ajax 请求,通过模拟请求得到真实的数据,这种方法在之前的文章中已经多次使用,这里就不再赘述了
- 使用 selenium 模拟浏览器进行动态渲染,从而获取网站返回的真实数据,以下我们将详细讲解这种方法
selenium 究竟是什么呢?简单来说,selenium 就是一个用于 Web 应用程序的测试工具
根据官方文档所说,selenium 最大的优点就是它可以直接运行在浏览器上,模拟用户的真实行为
但同时这也是它最大的缺点,由于需要模拟真实的渲染过程,所以导致它的运行速度变慢
其它详细的说明请参考 官方文档
二、selenium 使用
0、准备工作
- 安装 selenium
pip install selenium
- 安装驱动
在使用 selenium 的时候,必须有对应的浏览器驱动器文件在 Python 的安装目录下,否则会出现异常
Chrome 驱动器下载官网如下:https://sites.google.com/a/chromium.org/chromedriver/home
由于上面的官网需要翻墙才能访问,所以博主也在这里简单的给大家讲讲安装驱动的方法,具体的步骤如下:
打开 Chrome 浏览器,在地址栏中输入地址 chrome://settings/help,查看 Chrome 浏览器的版本信息
例如 70.0.3538.67
将上面的信息去掉最后一部分后附加到 https://chromedriver.storage.googleapis.com/LATEST_RELEASE_
例如 https://chromedriver.storage.googleapis.com/LATEST_RELEASE_70.0.3538
访问上面的链接,得到对应的驱动器版本信息
例如 70.0.3538.97
将上面的信息附加到 https://chromedriver.storage.googleapis.com/index.html?path=,并在最后带上斜杠
例如 https://chromedriver.storage.googleapis.com/index.html?path=70.0.3538.97/
访问上面的链接,选择合适平台(linux、mac、win)压缩包进行下载
等待下载完成后解压,将解压后的文件放到 Python 安装目录下即可
1、导入模块
>>> from selenium import webdriver
webdriver 就是我们上面所说的浏览器驱动器,它支持多种浏览器,下面以 Chrome 浏览器为例说明
2、开启浏览器
>>> browser = webdriver.Chrome()
>>> type(browser)
# <class 'selenium.webdriver.chrome.webdriver.WebDriver'>
3、访问页面
使用 WebDriver 对象的 get(url) 方法可以访问对应 URL 的页面
>>> browser.get('https://www.baidu.com')
>>> print(browser.current_url) # current_url 属性可以得到当前网页的 URL
# https://www.baidu.com/
>>> print(browser.page_source) # page_source 属性可以得到当前网页的源代码
4、查找元素
方法一 :
| 方法 | 描述 |
|---|---|
| find_element_by_id(id) | 通过 id 匹配 |
| find_element_by_name(name) | 通过 name 匹配 |
| find_element_by_class_name(name) | 通过 class_name 匹配 |
| find_element_by_tag_name(name) | 通过 tag_name 匹配 |
| find_element_by_link_text(link_text) | 通过 link_text 匹配 |
| find_element_by_partical_link_text(link_text) | 通过 partical_link_text 匹配 |
| find_element_by_css_selector(css_selector) | 通过 css_selector 匹配 |
| find_element_by_xpath(xpath) | 通过 xpath 匹配 |
以下尝试使用几种方法匹配输入框:
>>> search_bar = browser.find_element_by_id('kw')
>>> search_bar = browser.find_element_by_css_selector('#kw')
>>> search_bar = browser.find_element_by_xpath('//*[@id="kw"]')
>>> type(search_bar)
# <class 'selenium.webdriver.remote.webelement.WebElement'>
方法二:
>>> from selenium.webdriver.common.by import By
>>> element = browser.find_element(by,value)
- 参数 value 是与匹配方法对应的匹配表达式
- 参数 by 指定匹配方法,其可选值列举如下(和方法一类似)
| 值 | 描述 |
|---|---|
| By.ID | 通过 id 匹配 |
| By.NAME | 通过 name 匹配 |
| By.CLASS_NAME | 通过 class_name 匹配 |
| By.TAG_NAME | 通过 tag_name 匹配 |
| By.LINK_TEXT | 通过 link_text 匹配 |
| By.PARTIAL_LINK_TEXT | 通过 partical_link_text 匹配 |
| By.CSS_SELECTOR | 通过 css_selector 匹配 |
| By.XPATH | 通过 xpath 匹配 |
以下尝试使用几种方法匹配确认按钮:
>>> from selenium.webdriver.common.by import By
>>> button = browser.find_element(By.ID,'su')
>>> button = browser.find_element(By.CSS_SELECTOR,'#su')
>>> button = browser.find_element(By.XPATH,'//*[@id="su"]')
>>> type(button)
# <class 'selenium.webdriver.remote.webelement.WebElement'>
注意 :
对于两种方法来说,若成功找到则返回 WebElement 对象,若没有找到则抛出 NoSuchElementException 异常
当需要查找多个元素时,只需要把方法中的 element 改成 elements 即可,此时返回的是匹配列表
5、元素交互操作
常见的元素交互操作列举如下:
- 获取文本节点(可以使用 text 属性获取文本节点)
- 获取元素属性值
>>> button.get_attribute('type')
# 'submit'
- 写入输入框
>>> search_bar.send_keys('Selenium') # 向输入框输入内容
>>> search_bar.clear() # 清空输入框
>>> search_bar.send_keys('Selenium')
>>> from selenium.webdriver.common.keys import Keys
>>> search_bar.send_keys(Keys.ENTER) # 向输入框输入ENTER键
- 点击提交按钮
>>> button.click() # 点击提交按钮,等价于上面的 search_bar.send_keys(Keys.ENTER)
6、执行交互动作
将动作附加在动作链中串行执行,常用的方法列举如下:
| 方法 | 描述 |
|---|---|
| click(on_element=None) | 鼠标左键点击元素 |
| double_click(on_element=None) | 鼠标左键双击元素 |
| context_click(on_element=None) | 鼠标右键点击元素 |
| click_and_hold(on_element=None) | 按下鼠标 |
| release(on_element=None) | 松开鼠标 |
| move_to_element(to_element) | 移动鼠标到指定元素中央 |
| drag_and_drop(source, target) | 拖拽元素 |
| key_down(value, element=None) | 按下键盘,一般只用在 Ctrl、Alt 和 Shift |
| key_up(value, element=None) | 松开键盘 |
| send_keys(keys_to_send) | 发送键盘输入到当前聚焦元素 |
| send_keys_to_element(element, keys_to_send) | 发送键盘输入到指定元素 |
| pause(seconds) | 在指定的时间内暂停所有的输入 |
| perform() | 执行动作链的所有动作 |
以下示例为滚动到下一页按钮所在位置并点击下一页按钮翻页
>>> from selenium.webdriver.common.action_chains import ActionChains
>>> target = browser.find_element_by_class_name('n')
>>> ActionChains(browser).move_to_element(target).click(target).perform()
7、执行 JavaScript
JavaScript 能完成绝大部分的网页操作,由于内容庞杂,这里就不展开细说了
以下通过一个简单的例子来说明 JavaScript 的作用,其功能为拖动网页至底部:
>>> js = "window.scrollTo(0,document.body.scrollHeight)"
>>> browser.execute_script(js)
8、等待
规定等待的最长时间,若超过时间还未找到指定元素时,则抛出异常,先上代码感受一下:
>>> from selenium.webdriver.support.wait import WebDriverWait
>>> from selenium.webdriver.support import expected_conditions as EC
>>> wait = WebDriverWait(browser,10)
>>> try:
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME,'n')))
except:
browser.quit()
其它的 expected_conditions 方法列举如下:
| 属性 | 描述 |
|---|---|
| title_is(title) | 验证 title 是否等于 browser.title |
| title_contains(title) | 验证 title 是否包含于 browser.title |
| presence_of_element_located(locator) | 验证 locator 元素是否加载在 DOM 中 |
| presence_of_all_elements_located(locator) | 验证 locator 元素是否全部加载在 DOM 中 |
| visibility_of_element_located(locator) | 验证 locator 元素是否可见 |
| invisibility_of_element_located(locator) | 验证 locator 元素是否隐藏 |
| text_to_be_present_in_element(locator,text) | 验证 text 是否包含于 locator 元素的 text 中 |
| text_to_be_present_in_element_value(locator,text) | 验证 text 是否包含于 locator 元素的 value 中 |
| frame_to_be_available_and_switch_to_it(locator) | 验证 locator(frame) 元素是否可切入 |
| element_to_be_clickable(locator) | 验证 locator 元素是否可点击 |
| element_located_to_be_selected(locator) | 验证 locator 元素是否被选中 |
9、关闭浏览器
| 方法 | 描述 |
|---|---|
| close() | 关闭当前窗口 |
| quit() | 关闭所有关联窗口 |
一个简单的示例如下:
>>> browser.quit()
【参考资料】
【爬虫系列相关文章】
爬虫系列(十二) selenium的基本使用的更多相关文章
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- 爬虫系列(十三) 用selenium爬取京东商品
这篇文章,我们将通过 selenium 模拟用户使用浏览器的行为,爬取京东商品信息,还是先放上最终的效果图: 1.网页分析 (1)初步分析 原本博主打算写一个能够爬取所有商品信息的爬虫,可是在分析过程 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据
原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- struts2官方 中文教程 系列十二:控制标签
介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...
- Alamofire源码解读系列(十二)之时间轴(Timeline)
本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- SpringBoot系列(十二)过滤器配置详解
SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...
随机推荐
- [自己动手改wordpress.1]wordpress的插件User-Access-Manager在新的php版本号里面无法执行的bug.
近期同事在玩wp, 就顺带一起看了下. 她说插件有个不能用. 是一个叫User Access Manager 的插件 详细表现就是在后台填好相应的roles角色的时候, 点提交就会跳到一个错误的页面 ...
- [WebGL入门]二十三,反射光的光照效果
注:文章译自http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:],另外,鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...
- 一个简单RPC框架是怎样炼成的(I)——开局篇
开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架. RPC(Remote Procedure Call Protocol)--远程过程调用协议, ...
- 使用powershell来设置时间
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/set-date?view=powers ...
- Android+Jquery Mobile学习系列(3)-创建Android项目
前两章分别对开发环境和Jquery Mobile基础知识进行了介绍,本章介绍创建一个Android项目,并使用WebView控件显示HTML数据. 首先创建一个Android Application项 ...
- Java -JVM:JVM百科
ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...
- vs code golang代码自动补全
“go.useCodeSnippetsOnFunctionSuggest”: true 文件-->首选项--->设置--->用户设置 添加下行:然后就可以自动补全了,包括() “go ...
- Check the difficulty of problems(概率+DP)
http://poj.org/problem?id=2151 看的题解..表示没看懂状态转移方程.. #include<stdio.h> #include<string.h> ...
- Windows7环境下Composer 安装包的Cache目录位置
http://segmentfault.com/a/1190000000355928 https://getcomposer.org/doc/ 要说Composer的用法,以后再说,现在只记录wind ...
- MySQL Connector for .NET 和 EF版本匹配问题
以下讨论的都是EF5.0, 版本号:4.4.0.0 如果装了MySQL 5.0.1 , 那么最好用MySQL Connector 6.3.6,但是创建数据库后,生成迁移历史表的时候,会报错,你不管,直 ...