爬虫学习4—Selenium模块
一、Selenium 简介
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
1、Selenium功能
框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
使用简单,可使用Java,Python等多种语言编写用例脚本。
2、Selenium的作用和工作原理
Selenium的作用:利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)
Selenium的工作原理:
二、Selenium环境安装
1、python服务端安装selenium模块
python/python3 -m pip install selenium
2、安装webdriver
webdriver区分不同os环境和版本,安装webdriver需要对应浏览器的版本。
2.1 Windows环境安装配置webdriver
(1)以、Win10 为例,首先系统已经安装谷歌浏览器,查看谷歌浏览器版本。
(2)访问https://registry.npmmirror.com/binary.html?path=chromedriver/,点击进入不同版本的chromedriver下载页面。或者这个页面:http://chromedriver.storage.googleapis.com/index.html
这上面的界面下载对应os版本的chromedriver。我这里使用win10做演示,所以下载“chromedriver_win32.zip”。
解压此压缩包后双击chromedriver.exe运行
(3)selenium启动chromedriver
先设置chromedriver的环境变量
调用演示
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path="C:\chromedriver\chromedriver.exe",options=options)
driver.get("https://blog.csdn.net/")
driver.maximize_window()
time.sleep(3)
driver.close()
2.2 Macos环境安装配置webdriver
访问https://registry.npmmirror.com/binary.html?path=chromedriver/,点击进入下载mac版本的chromedriver。或者这个页面:http://chromedriver.storage.googleapis.com/index.html
下载好后配置环境变量:
进入/usr/local/bin目录(由于Mac该目录是隐藏的,所以可通过快捷键command+shift+g打开)
代码实例:
from selenium import webdriver
import time
wd = webdriver.Chrome()
wd.get("https://www.baidu.com")
time.sleep(3)
wd.quit()
2.3 Linux环境(centos7 系统)安装配置webdriver
我们在用Python做爬虫的时候,会经常用到无页面浏览器phantomjs。
但是我们一般用chrome/firefox查看效果,再转成phantomjs。这样比较费时间,另一方面phantomjs不太稳定,而且官方已经停止维护了。所以我们再linux系统安装各个浏览器。
安装方法1:yum install google-chrome -y
不能装上的话就尝试直接下载后安装
安装方法2:
下载chrome:wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
可能会遇到网路问题,你可以先下载到本地再上传
安装chrome浏览器
yum install ./google-chrome-stable_current_x86_64.rpm -y
google-chrome --version 查看版本
安装配置chromedriver
注意chromedriver的版本,要与你安装的chrome版本对应上,这里的版本已经不是最新的。
版本列表:访问https://registry.npmmirror.com/binary.html?path=chromedriver/,或者这个页面:http://chromedriver.storage.googleapis.com/index.html
下载chromedriver_linux64.zip
wget wget https://registry.npmmirror.com/-/binary/chromedriver/89.0.4389.23/chromedriver_linux64.zip
解压chromedriver_linux64.zip
unzip chromedriver_linux64.zip
为chromedriver授权
chmod 755 chromedriver
拷贝至可执行目录
cp ./chromedriver /usr/bin/
Python代码测试
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument('--no-sandbox')
options.add_argument("--disable-gpu")
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(chrome_options=options,executable_path='/usr/bin/chromedriver')
driver.get("http://www.itcast.cn/")
driver.save_screenshot("itcast.png")
time.sleep(3)
print(driver.title)
driver.quit()
三、Selenium应用
1、webdriver 对象的常见属性和方法
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path="C:\chromedriver\chromedriver.exe",options=options)
driver.get("https://www.baidu.com")
driver.maximize_window()
driver.page_source
driver.current_url
driver.quit()
time.sleep(2)
driver.get("https://www.csdn.net/")
time.sleep(2)
driver.back()
time.sleep(2)
driver.forward()
driver.save_screenshot("baidu.png")
time.sleep(3)
driver.title
driver.desired_capabilities
driver.get_cookies()
driver.fullscreen_window()
driver.session_id
driver.close()
示例演示
(1)driver.get(“https://www.baidu.com”) # 访问指定网页
(2)driver.maximize_window() # 最大化浏览器
显示结果如下:
(3)driver.page_source # 当前标签页浏览器渲染之后的网页源代码
显示结果如下:
(4)driver.current_url # 当前标签页的url
显示结果如下:
(5) driver.save_screenshot(“baidu.png”) # 页面截图,长用来破解验证码
结果如下:
2、Driver对象的元素获取标签定位的方法
find_element_by_id (返回一个元素)
find_element(s)_by_class_name (根据类名获取元素列表)
find_element(s)_by_name (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath (返回一个包含元素的列表)
find_element(s)_by_link_text (根据连接文本获取元素列表)
find_element(s)_by_partial_link_text (根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name (根据标签名获取元素列表)
find_element(s)_by_css_selector (根据css选择器来获取元素列表)
注意:
- find_element和find_elements的区别:
- 多了个s就返回列表,没有s就返回匹配到的第一个标签对象;
- find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表;
- by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
- 以上函数的使用方法
- driver.find_element_by_id('id_str')
示例1 find_element_by_id
from selenium import webdriver
import time
url = "https://www.baidu.com"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)
driver.get(url)
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("翡翠鉴定")
driver.find_element_by_css_selector('#kw').send_keys("和田玉")
driver.find_element_by_class_name('s_ipt').send_keys("今天是否下雨")
driver.find_element_by_name('wd').send_keys("python3")
driver.find_element_by_link_text('新闻').click()
driver.find_element_by_partial_link_text('hao').click()
print(driver.find_element_by_tag_name('title'))
driver.find_element_by_id('su').click()
结果显示:
3、标签对象提取文本内容及其他属性操作
find_element仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法:
- 对元素执行点击操作element.click()
对定位到的标签对象进行点击操作
- 向输入框输入数据element.send_keys(data)
对定位到的标签对象输入数据
- 获取文本element.text
通过定位获取的标签对象的text属性,获取文本内容
- 获取属性值element.get_attribute("属性名")
通过定位获取的标签对象的get_attribute函数,传入属性名,来获取属性的值
示例1,获取文本和属性
from selenium import webdriver
import time
url = "https://58.com/zufang/"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)
driver.get(url)
el_list = driver.find_elements_by_xpath('//*[@id="global"]/table/tbody/tr/td[2]/a')
for el in el_list:
print(el.text)
print(el.get_attribute('href'))
运行结果:
示例2 发送数据
from selenium import webdriver
import time
url = "https://gitee.com/login"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)
driver.get(url)
driver.find_element_by_xpath('//*[@id="user_login"]').clear()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="user_login"]').send_keys('用户名')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="user_password"]').clear()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="user_password"]').send_keys('密码')
driver.find_element_by_xpath('//*[@id="new_user"]/div/div/div/div[4]/input').click()
4、selenium标签页的切换
当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换呢?需要我们做以下两步:
- 获取所有标签页的窗口句柄
- 利用窗口句柄字切换到句柄指向的标签页
- 这里的窗口句柄是指:指向标签页对象的标识
具体的方法:
第一步: 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles
第二步: 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])
代码示例
from selenium import webdriver
import time
url = "https://cn.58.com/"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)
driver.get(url)
print(driver.current_url)
print(driver.window_handles)
ele = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[7]/a')
ele.click()
driver.switch_to_window(driver.window_handles[-1])
print(driver.current_url)
print(driver.window_handles)
xiangxi = driver.find_element_by_xpath('//*[@id="esfMain"]/section/section[3]/section[1]/section[2]/div[1]/a/div[2]/div[1]/div[1]/h3')
print(xiangxi.text)
xiangxi.click()
driver.switch_to_window(driver.window_handles[-1])
print(driver.current_url)
print(driver.window_handles)
neixiang = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[2]/div[2]/div[2]/div[1]/div[2]/div[1]/span[1]').text
print(neixiang)
|