本篇介绍爬虫的一把利器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():截图