应用场景
- 在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种, 一种通过ajax请求加载数据, 另一种通过js代码加载动态数据(js传参和js数据加密).
selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据 - url加密过无法破解规律
简介
selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制
支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器.
下载工作
pip install selenium
谷歌
- 查看Chrome 的 版本号
- http://chromedriver.storage.googleapis.com/index.html根据 version 的前几位
下载chromedriver.exe
PhantomJS无界面浏览器
- PhantomJS下载及配置环境变量
- 下载, 直接解压
- 将解压文件的bin目录添加至环境变量
实例化浏览器对象
这里一谷歌为例
from selenium import webdriver
browser= webdriver.Chrome(executable_path='./chromedriver.exe')
browser.get('url')
下面是谷歌无头浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless') # 无头
chrome_options.add_argument('--disable-gpu') # 无需渲染
webdriver.Chrome(executable_path='news163/spiders/chromedriver.exe', options=chrome_options)
需要注意的是,在使用多线程爬取数据、Scrapy框架或其他场景,注意不要重复实例化浏览器
爬取数据
发送get请求:
browser.get(‘https://www.baidu.com’)
获取页面元素:
- find_element_by_id:根据元素的id
- find_element_by_name:根据元素的name
- find_element_by_xpath:根据xpath表达式
- find_element_by_class_name:根据class的值
- find_element_by_css_selector:根据css选择器
节点交互操作:
- click(): 点击
- send_keys(): 输入内容
- clear(): 清空操作
执行指定的js代码
- browser.execute_script(js):
JS代码:
window.scrollTo(0, document.body.scrollHeight) # 可以模拟鼠标滚动一屏高度
switch_to()方法:
- driver.switch_to.window(window_name) 切换到制定的window_name页面
- driver.switch_to.alert() 切换到alert弹窗
- driver.switch_to.active_element() 定位到当前聚焦的元素上
- driver.switch_to.default_content() 切换到最上层页面(主文档?)
- switch_to.frame(‘frameid’) 通过id、name、element(定位的某个元素)、索引来切换到某个frame
- switch_to.parent_frame()可以切换到上一层的frame
这是switch_to中独有的方法对于层层嵌套的frame很有用
扩展
<iframe>
元素会创建包含另外一个文档的内联框架(即行内框架)
获取网页数据
- browser.page_source
退出浏览器
- browser.quit()
ps:
在爬取数据时,应灵活使用time.sleep()方法,以数据丢失,且尽量模拟真人操作浏览器