selenium模块

一、selenlum介绍

selenium这个三方库,最初是一个自动化测试工具,可以实现让浏览器完成自动化的操作。
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。

官方文档:Selenium with Python

二、环境搭建

1、安装selenum

$ pip3 install selenium

2、获取浏览器的驱动程序

3、获取浏览器驱动示例

(1)查看浏览器版本

Chrome——>关于Google Chrome

Google浏览器版本

(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、获取无界面浏览器驱动程序

PhantomJS下载链接

我是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:

baidu图片

meinv.png:

meinv图片

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)需求示例

获取豆瓣电影中动态加载出更多的电影详情数据。

(2)拖动到底部的js

拖动底部

五、扩展学习网址

selenium官网
selenium模块

posted @ 2018-11-22 00:27  休耕  阅读(602)  评论(0编辑  收藏  举报