selenium模块
一、selenlum介绍
selenium这个三方库,最初是一个自动化测试工具,可以实现让浏览器完成自动化的操作。
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。
二、环境搭建
1、安装selenum
$ pip3 install selenium
2、获取浏览器的驱动程序
- 不获得浏览器的驱动程序则无法操作浏览器。以谷歌浏览器为例:谷歌浏览器驱动下载地址
- 下载的驱动程序必须和浏览器的版本统一,具体查看:selenium之 chromedriver与chrome版本映射表
3、获取浏览器驱动示例
(1)查看浏览器版本
Chrome——>关于Google Chrome
(2)下载浏览器对应的驱动程序
查看chrome和chromedriver的对应关系,我应该下载 70.0.3538.110 版本对应的chromedriver驱动。
在谷歌浏览器驱动下载地址下载驱动:
我选择MAC版本的驱动下载,解压后,将文件chromedriver拷贝到项目目录下。
三、编码流程
from selenium import webdriver
from time import sleep
# 创建一个浏览器对象executable_path驱动的路径
bro = webdriver.Chrome(executable_path='./chromedriver')
# get方法可以指定一个url,让浏览器进行请求
bro.get('https://www.baidu.com')
sleep(1) # 等待打开页面
# 让百度进行指定词条的一个搜索
text = bro.find_element_by_id('kw') # 定位到text搜索文本框
text.send_keys('人民币') # send_keys表示向文本框中录入指定内容
sleep(1) # 等待文本输入
# 点击搜索按钮
button = bro.find_element_by_id('su')
button.click() # click表示点击操作
sleep(3) # 等待查询结果
# 关闭浏览器
bro.quit()
1、自动测试软件控制浏览器
(1)执行如下代码:
from selenium import webdriver
# 创建一个浏览器对象executable_path驱动的路径
bro = webdriver.Chrome(executable_path='./chromedriver')
# get方法可以指定一个url,让浏览器进行请求
bro.get('https://www.baidu.com')
(2)效果如下所示:
自动打开浏览器并进入百度页面:
2、查找指定的元素进行操作的方法
find_element_by_id # 根据id找节点
find_elements_by_name # 根据name找
find_elements_by_xpath # 根据xpath查找
find_elements_by_tag_name # 根据标签名找
find_elements_by_class_name # 根据class名字查找
四、phantomJS
phantomJS是一款基于无界面的浏览器。其自动化操作流程和上述操作谷歌浏览器是一致的。
由于是无界面的(无法观察自动化过程),为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。
1、获取无界面浏览器驱动程序
我是MAC OS系统,因此下载MAC OS系统的PhantomJS驱动。下载zip压缩包后,解压文件,找到文件:phantomjs-2.1.1-macosx/bin/phantomjs。
2、phantomJS代码演示
from selenium import webdriver
import time
browser = webdriver.PhantomJS(executable_path='/Users/hqs/phantomjs-2.1.1-macosx/bin/phantomjs')
# 打开浏览器
browser.get('http://www.baidu.com')
time.sleep(2)
# 截屏
browser.save_screenshot(r'./baidu.png')
# 查找input输入框
text = browser.find_element_by_id('kw') # 定位到了text文本框
text.send_keys('美女') # send_keys表示向文本框中录入指定内容
time.sleep(1)
# 再次截屏
browser.save_screenshot(r'./meinv.png')
browser.quit()
代码执行后,会创建出三个文件:baidu.png、meinv.png和ghostdriver.log。
baidu.png:
meinv.png:
3、使用selenium + phantomJS处理页面动态加载数据的爬取
selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。
from selenium import webdriver
from time import sleep
# 创建无界面的浏览器对象
browser = webdriver.PhantomJS(executable_path='/Users/hqs/phantomjs-2.1.1-macosx/bin/phantomjs')
url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='
# 打开浏览器
browser.get(url)
sleep(1)
# 截屏
browser.save_screenshot('./1.png')
# 编写js代码:让页面中的滚轮向下滑动(到底部)
js = 'window.scrollTo(0, document.body.scrollHeight)' # 水平方向不动,拖动到底部
# 让浏览器对象执行js代码
browser.execute_script(js)
sleep(1)
# 截屏(2)
browser.save_screenshot('./2.png') # 获取了更多的页面
# 获取加载数据后的页面
# page_source获取浏览器当前的页面数据
page_text = browser.page_source # 页面源码更多
(1)需求示例
获取豆瓣电影中动态加载出更多的电影详情数据。