IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 爬虫学习4---Selenium模块 -> 正文阅读

[Python知识库]爬虫学习4---Selenium模块

爬虫学习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的环境变量

在这里插入图片描述
![(https://img-blog.csdnimg.cn/21bebed1ff704492b6f536439dba9bb1.png)

在这里插入图片描述

调用演示
import time
from selenium import webdriver

options = webdriver.ChromeOptions()
# 这个是绝对路径
driver = webdriver.Chrome(executable_path="C:\chromedriver\chromedriver.exe",options=options)
# driver = webdriver.Chrome()   # 这是已配置环境变量版的,但经测试效果不好,后面就使用绝对路径版的。
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)   #等待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')  # linux上需要设置上面四项内容。
driver = webdriver.Chrome(chrome_options=options,executable_path='/usr/bin/chromedriver')
driver.get("http://www.itcast.cn/")

# 把网页保存为图片,69版本以上的谷歌浏览器将无法使用截图功能
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 = webdriver.Chrome()   # 这是已配置环境变量版的,但经测试效果不好,后面就使用绝对路径版的。
driver.get("https://www.baidu.com")   # 访问指定网页
driver.maximize_window()   # 最大化浏览器
driver.page_source    # 当前标签页浏览器渲染之后的网页源代码
driver.current_url   # 当前标签页的url
driver.quit()    # 关闭浏览器
time.sleep(2)
driver.get("https://www.csdn.net/")   # 页面转到csdn
time.sleep(2)
driver.back()    # 页面后退回baidu
time.sleep(2)
driver.forward()   # 页面前进到csdn
driver.save_screenshot("baidu.png")   # 页面截图
time.sleep(3)
driver.title   # 获取页面标题
driver.desired_capabilities   # 获取浏览器信息
driver.get_cookies()   # 获取页面的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)  # 请求Url
# 第一步:再百度上查找“翡翠鉴定”的关键词。这里是通过xpath获取input的输入框标签
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("翡翠鉴定")
# 通过css_selector获取input的输入框标签,再选取css选择器时右键“Copy selector”就可获取
driver.find_element_by_css_selector('#kw').send_keys("和田玉")
# 通过class_name获取input的输入框标签,class_name使用时可能会出现多个相同的class_name的名字
driver.find_element_by_class_name('s_ipt').send_keys("今天是否下雨")
# 通过name属性获取input的输入框标签
driver.find_element_by_name('wd').send_keys("python3")
# 通过link_text获取input的输入框标签
driver.find_element_by_link_text('新闻').click()
# 通过_partial_link_text获取input的输入框标签
driver.find_element_by_partial_link_text('hao').click()
# 通过tag_name获取input的输入框标签,目标元素再当前html中是唯一元素或是众多标签的第一个才能显示。
print(driver.find_element_by_tag_name('title'))


# 第二步:找到百度一下的标签后执行点击的动作click(),这里是通过id来获取“百度一下的输入框标签”
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()
# options.add_argument("--headless")  # 开启无界面模式
# options.add_argument('--no-sandbox')
# options.add_argument("--disable-gpu")
# options.add_argument('--disable-dev-shm-usage')  # linux上需要设置上面四项内容。
# driver = webdriver.Chrome(chrome_options=options,executable_path='/usr/bin/chromedriver')
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)    # 对象
driver.get(url)  # 请求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()
# options.add_argument("--headless")  # 开启无界面模式
# options.add_argument('--no-sandbox')
# options.add_argument("--disable-gpu")
# options.add_argument('--disable-dev-shm-usage')  # linux上需要设置上面四项内容。
# driver = webdriver.Chrome(chrome_options=options,executable_path='/usr/bin/chromedriver')
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)    # 对象
driver.get(url)  # 请求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()
# options.add_argument("--headless")  # 开启无界面模式
# options.add_argument('--no-sandbox')
# options.add_argument("--disable-gpu")
# options.add_argument('--disable-dev-shm-usage')  # linux上需要设置上面四项内容。
# driver = webdriver.Chrome(chrome_options=options,executable_path='/usr/bin/chromedriver')
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path='C:\chromedriver\chromedriver.exe',options=options)    # 对象
driver.get(url)  # 请求Url

print(driver.current_url)   # 打印当前请求的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)   # 打印此时请求的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)   # 查看此时访问的页面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)
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:33:54  更:2022-06-14 22:34:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:36:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码