本篇介绍爬虫的一把利器Selenium。
概念
概念:基于浏览器自动化的一个模块。
 广泛用于自动化测试
selenium和爬虫之间的关联
- 便捷的爬取到动态加载的数据- 可见即可得
 
- 便捷的实现模拟登录
基本使用
- 环境安装 pip install selenium
- 下载浏览器得驱动程序- 地址: https://npm.taobao.org/mirrors/chromedriver
- 浏览器版本和驱动程序得映射关系:按照浏览器的大版本号下载最新即可。- 如我的浏览器是 76.0.3809.132 下载 76.0.3809.68/
 
 
- 地址: 
原则:
- 迫不得已之后是使用 selenium 
- selenium 不支持异步 
- pyppeteer 支持异步,基于asyncio 
扩充:
- Appnium:基于手机的自动化的模块
演示程序
| 1 | from selenium import webdriver | 
基本操作
| 1 | from selenium import webdriver | 
爬取动态数据
- 在爬取页面的时候我们要先判断数据是不是动态加载的,如果是动态加载的话就需要找它的url
- 对于selenium无须如此,可见即可得
需求:爬取 https://www.fjggfw.gov.cn/Website/JYXXNew.aspx 所展示得公告标题。
| 1 | from selenium import webdriver | 
动作链
需求:打开 https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable 并拖动方块
动作链:
- 实例化 ActionChains(bro)后就可以使用动作了
- 在使用find系列得函数进行标签定位得时候如果出现了NoSuchElementException的时候:可能是iframe做html嵌套
- 如果定位的标签是存在于 iframe 标签之下的,则在进行指定标签定位的时候,必须使用 switch_to.frame() 操作即可
| 1 | from selenium import webdriver | 
谷歌无头浏览器
😨第一次听这么恐怖得名称,所谓无头(headless)浏览器指的是没有可视化界面得浏览器。这样打包好给用户,不至于用户在使用得时候发现自己得浏览器开始骚操作了~
- 当然还有一个无头浏览器,称为phantomjs(停止更新了)。
只需要在原来代码得基础上加入如下内容:
| 1 | from selenium.webdriver.chrome.options import Options | 
例子:打开淘宝并截图
| 1 | from selenium import webdriver | 
如果规避监测
既然selenium这么利,防守方该怎么做呢?
- 服务器会对 selenium 暴露出的一些变量进行监测,如果监测到用户使用了 selenium 则不让其访问。
首先执行如下:
| 1 | from selenium import webdriver | 
打开淘宝页面,然后我们打开开发者工具,点击 console 执行 js 注入,输入这一句:
window.navigator.webdriver
- undefined:正常
- true:使用了selenium
那我们该如何规避监测呢? 同样是一段代码,随用随粘
| 1 | from selenium.webdriver import ChromeOptions | 
补充上例:
| 1 | from selenium import webdriver | 
12306的模拟登录
地址为:https://kyfw.12306.cn/otn/login/init
- 核心: 验证码图片的截取、使用动作链
流程:
- 获取登录页面,并截图
- 定位img标签的位置和大小,用于对前面截到的图片进行裁剪得到验证码。
- 通过打码平台确定需要点击的坐标,然后定义动作链,完成验证码校验- 对于验证码我使用打码平台 (超级鹰)
 
- 填写用户名,密码,点击按钮即可
| 1 | from selenium import webdriver | 
总结
用到的方法
- webdriver.Chrome() 实例一个浏览器对象(驱动程序)
- get():发送get请求
- find的系列的函数:用作标签定位
- send_keys(): 进行向标签中录入数据
- click()
- excute_script(‘j’): js注入
- page_sourse: 返回的是页面源码数据
- switch_to.frame(): 如何定位的标签是存在于嵌套页面中,需要定位前先切换到这个子页面中
- save_screenshot():截图

