python 爬虫之 selenium 可视化爬虫
@[TOC]
前文回顾
>一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍
之所以把 selenium 爬虫称之为可视化爬虫
主要是相较于前面所提到的几种网页解析的爬虫方式
selenium 爬虫主要是模拟人的点击操作
selenium 驱动浏览器并进行操作的过程是可以观察到的
就类似于你在看着别人在帮你操纵你的电脑,类似于别人远程使用你的电脑
当然了,selenium 也有无界面模式
快速入门
selenium 基本介绍:
selenium 是一套完整的 web 应用程序测试系统,
包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)
和测试的并行处理(Selenium Grid)。
Selenium 的核心 Selenium Core 基于 JsUnit,
完全由 JavaScript 编写,因此可以用于任何支持 JavaScript 的浏览器上。
selenium 可以模拟真实浏览器,自动化测试工具,支持多种浏览器,
爬虫中主要用来解决 JavaScript 渲染问题。
用 python 写爬虫的时候,主要用的是 selenium 的 Webdriver,
>注意对应版本号,chrome 地址栏输入 chrome://version/ 查看自己的 Chrome 版本
>我使用的是 anaconda 下载好后丢入 anaconda3\Scripts 文件夹下就可以了
>如果是其他 ide 如:pycharm、VScode 但加载的还是 anaconda 的集成 python,依然可以这么操作
简单测试
元素定位
要想对页面进行操作,首先要做的是选中页面元素,
比较常见的八种元素定位方式,如下表
| 定位一个元素 |定位多个元素 |定位方式描述 |
|:--|:--|:--|
|findelementby_id | find_elementsbyid | 通过元素 id 进行定位 |
|findelementby_name | find_elementsbyname | 通过元素 名称进行定位 |
|findelementby_xpath | find_elementsbyxpath | 通过 xpath 路径进行定位 |
|findelementby_link_text | findelementsby_link_text | 通过完整超链接文本进行定位 |
|findelementby_partial_linktext | findelementsbypartiallinktext | 通过部分超链接文本进行定位 |
|findelementby_tag_name | findelementsby_tag_name | 通过标记名称进行定位 |
|findelementby_class_name | findelementsby_class_name | 通过类名称进行定位 |
|findelementby_css_selector | findelementsby_css_selector | 通过 css 选择器进行定位 |
>更详细定位方式可以参考:《史上最全!Selenium元素定位的30种方式》
页面操作
1.表单填充
2.窗口句柄
简单讲,句柄就是浏览器上方每一个窗口栏的唯一标识
3.url 加载和获取
4.cookie 处理
get_cookies:获取 cookie 信息
add_cookie:添加 cookie 信息
等待方式
现在很多网站采用 Ajax 技术
无法确定网页元素什么时候能被完全加载
所以网页元素的选取比较困难
此时就需要设置等待(等待网页加载完成)
selenium 有两种等待方式:
显式等待
隐式等待
1.显式等待
显式等待是一种条件触发式等待
直到设置的某一条件达成时才会继续执行
可以设置超时时间,如果超过超时时间元素依然没被加载,就会抛出异常
以上代码加载 'http://www.baidu.com/'页面
并定位 id 为"LoginForm[username]"的元素
设置超时时间 10 秒,webDriverWait 默认会 500ms 检测一下元素是否存在
selenium 提供了一些内置的用于显示等待的方法,
位于 expected_conditions 类中,详细见下表
|内置方法 | 功能|
|:--|:--|
| title_is | 判断当前页面的 title 是否等于预期内容 |
| title_contains | 判断当前页面的 title 是否包含预期字符串 |
|presenceofelement_located|判断某个元素是否被加到了 dom 树里,<br>并不代表该元素一定可见|
|presenceofall_element_located|判断是否至少有 1 个元素存在于 dom 树里|
|visibilityofelement_located|判断某个元素是否可见|
|visibility_of|判断某个元素是否可见|
|invisibilityofelement_located|判断某个元素是否不存在于 dom 树里或不可见|
|texttobe_present_in_element|判断元素中的 text 是否包含了预期的字符串|
|texttobe_present_inelementvalue|判断元素中的 value 属性是否包含了预期字符|
|frametobe_available_andswitchto_it|判断该 frame 是否可以切换进去,如果可以,<br>返回 True 并切换进去,否则返回 False|
|elementtobe_clickable|判断某个元素是否可见并且是 enable 的|
|staleness_of|等待某个元素从 dom 树中移除|
|elementtobe_selected|判断某个元素是否被选中了,一般用于下拉列表|
|elementlocatedto_be_selected|判断某个元素是否被选中了,一般用于下拉列表|
|elementselectionstatetobe|判断某个元素的选中状态是否符合预期|
|elementlocatedselectionstateto_be|判断某个元素的选中状态是否符合预期
|alertispresent|判断页面上是否存在 alert 框|
2.隐式等待
隐式等待是在尝试定位某个元素时,如果没能立刻发现,就等待固定时长
类似于 socket 超时,默认设置是 0 秒,即相当于最长等待时长
在浏览器界面直观感受是:
等待直到网页加载完成(地址栏这个地方不是× 变成如下)时继续执行,
网页加载超过设置等待时长才报错
使用方法
3.线程休眠
time.sleep(time)是比较常用的线程休眠方式
为了避免风险,我个人比较喜欢随机休眠
time.sleep(random.uniform(4,5))
扩展程序加载
版权声明: 本文为 InfoQ 作者【诡途】的原创文章。
原文链接:【http://xie.infoq.cn/article/b07b150ceaf89c77391373edd】。文章转载请联系作者。
评论