Selenium 是一个 Web 应用的自动化框架,支持多种浏览器。使用它可以非常便捷的捕获到任意形式的动态加载出来的数据,可见即可得,但是爬取数据的效率低,还可以用来实现模拟登录。爬虫中主要用来解决JavaScript渲染问题。
Selenium原理
selenium主要就是通过操作浏览器驱动,来达到我们想要的目的,这里的原理跟我们人手动去操作浏览器差不多。主要说一下浏览器驱动的安装。浏览器驱动 也是一个独立的程序,是由浏览器厂商提供的,浏览器驱动 是和 浏览器对应的。 不同的浏览器 需要选择不同的浏览器驱动。 比如 Chrome浏览器和 火狐浏览器有 各自不同的驱动程序。这里只给出比较常用的浏览器驱动下载:chromedriver、 geckodriver 驱动程序
浏览器驱动 必须要和浏览器版本匹配,下图红圈里面的版本号 就是和浏览器版本号对应的
你需要查看一下当前Chrome浏览器的版本,下载对应版本的驱动程序。在设置中找到关于Chrome,就可看到浏览器的版本信息了:

比如:当前Chrome浏览器版本是74, 就需要下载74开头的目录里面的驱动程序 。打开目录,里面有3个zip包,分别对应Linux、Mac、Windows平台。如果我们是Windows平台的电脑,就下载 chromedriver_win32.zip这是个zip包,下载下来之后,解压里面的程序文件 chromedriver.exe ,那么这里建议直接放到Python.exe程序目录下,或者将路径加入到环境变量中也是可以的。
Selenium安装
在Python中安装selenium非常简单:pip install selenium
即可
Selenium简单使用
from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome() #直接放在Python程序目录,就不用写路径
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
driver.get('http://www.e1yu')
代码也是非常的简单,我觉得不用再详细解释了,自己照着敲敲记记就可以了。
Selenium选择元素
我们打开了某个网站之后,就需要做一些相关的操作,比方说搜索啊、点击啊等等一些人可以做到的事情,那么我们的程序也可以做到
根据 元素的id属性选择元素
from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver=webdriver.Chrome()
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
driver.get('https://www.baidu.com/')
# 根据id选择元素,返回的就是该元素对应的WebElement对象
search=driver.find_element_by_id('kw') #kw为百度搜索框的id属性值
# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
search.send_keys('妹子图片')
根据 class属性、tag名选择元素
html页面中不仅有id属性,也有class属性和标签名,同样我们也可以选择除id之外的属性:
from selenium import webdriver
# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome()
# WebDriver 实例对象的get方法 可以让浏览器打开指定网址
driver.get('https://www.meizitu.com/')
# 根据 class name 选择元素,返回的是 一个列表
# 里面 都是class 属性值为 tags的元素对应的 WebElement对象
elements = driver.find_elements_by_class_name('tags')
# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://baidu.com')
# 根据 tag name 选择元素,返回的是 一个列表
# 里面 都是 tag 名为 div 的元素对应的 WebElement对象
elements = driver.find_elements_by_tag_name('div')
# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
总结一下selenium常用的查找元素的方法:
find_element_by_id(通过id)
find_element_by_name(通过name)
find_element_by_xpath(xpath定位)
find_element_by_link_text(a标签中的文本定位)
find_element_by_partial_link_text(部分文本)
find_element_by_tag_name(标签name)
find_element_by_class_name(class属性的name)
find_element_by_css_selector(css选择器)
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
单个元素跟多个元素之间就差一个s,对于css选择器、xpath、css select都可以使用浏览器自带的工具找到:

from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
# 通过xpath表达式来查找,方法中第一个参数是指定选取元素的方式,第二个参数是选取元素需要传入的值或表达式
By.ID
By.XPATH
By.LINK_TEXT
By.PARTIAL_LINK_TEXT
By.NAME
By.TAG_NAME
By.CLASS_NAME
Selenium等待元素
在我们进行网页操作的时候,会受网络因素影响,页面元素没有加载完毕,就进行元素查找,这时候就会报错:selenium.common.exceptions.NoSuchElementException: Message: no such element。通常情况下都是需要设置等待时间,等待页面加载完毕,再进行操作。
Selenium提供了一个解决方案,是这样的:当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,如果超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。
Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait该方法接受一个参数, 用来指定 最大等待时长:
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw')
search.send_keys('妹子图片')
contents=driver.find_element_by_id('1')
print(contents)
Selenium操控元素
选择到元素之后,代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以 操控 元素了。 包括click点击元素呐、在元素中输入字符串(send_keys)、获取元素的文本内容(text方法)、获取元素属性(get_attribute 方法)、获取整个元素对应的HTML(get_attribute(‘outerHTML’))、获取某个元素 内部 的HTML文本内容(get_attribute(‘innerHTML’))
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw') #找到搜索框
search.clear() #清空搜索框内容
search.send_keys('妹子图片') #输入"妹子图片"字符串
contents=driver.find_elements_by_class_name('result') #找到class属性为result的多个值
for content in contents:
print(content.text)
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw') #找到搜索框
search.clear() #清空搜索框内容
search.send_keys('妹子图片') #输入"妹子图片"字符串
contents=driver.find_element_by_class_name('result') #找到class属性为result的多个值
print(contents.get_attribute('outerHTML')) #返回一个包含class属性为result的div
print(contents.get_attribute('innerHTML')) #返回class属性为result的div标签里面的内容
Selenium选择框
有的网站是选择翻页的。select框 则是一个新的select标签。 Selenium 专门提供了一个 Select类 进行操作。Select类 提供了如下的方法:
select_by_value 根据选项的 value属性值 ,选择元素。
select_by_index 根据选项的 次序 (从1开始),选择元素
select_by_visible_text 根据选项的 可见文本 ,选择元素。
deselect_by_value 根据选项的value属性值, 去除 选中元素
deselect_by_index 根据选项的次序,去除 选中元素
deselect_by_visible_text 根据选项的可见文本,去除 选中元素
deselect_all 去除 选中所有元素

我们面对上面的页面,就可以使用Select类来选择元素,可以参考下面的代码:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://www.rosi999.com/x/rosi/')
select=Select(driver.find_element_by_css_selector('body > div > div.div_box > ul.cPage > li:nth-child(5) > select'))
# for i in range(110):
# select.select_by_index(i) #采用循环翻页
select.select_by_visible_text('5') #选择页码进行翻页
select.select_by_value('list_1_8.html')#选择option标签的value属性翻页
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
那么你使用上面的代码翻页,会遇到前面的错误,就是点击太快,页面没有加载完成,需要加入等待。
设置phantomJS请求头中User-Agent
一般针对phantomJS的反爬虫措施都会检测User-Agent,默认的User-Agent中含有phantomJS内容,可以通过代码进行修改。代码如下:
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"
)
driver = webdriver.PhantomJS()# desired_capabilities=dcap)
driver.get("https://www.e1yu.com/")
driver.quit()
移动鼠标
百度首页的右上角,有个 更多产品 选项。如果我们把鼠标放在上边,就会弹出 下面的 糯米、音乐、图片 等图标。使用 ActionChains 来 模拟鼠标移动 操作的代码如下:
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://www.baidu.com/')
action = ActionChains(driver)
# 鼠标移动到 元素上
action.move_to_element(
driver.find_element_by_css_selector('.s_bdbriwrapper > a:nth-child(3)')
).perform()
截屏
有的时候,我们需要把浏览器屏幕内容保存为图片文件。做自动化测试时,一个测试用例检查点发现错误,我们可以截屏为文件,以便测试结束时进行人工核查。可以使用 WebDriver 的 get_screenshot_as_file方法来截屏并保存为图片。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.baidu.com/')
# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
#或
driver.save_screenshot('1.png')
上传文件
有时候,网站操作需要上传文件。著名的在线图片压缩网站:https://tinypng.com/。通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。
<input type="file" multiple="multiple">
使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可。
# 先定位到上传文件的 input 元素
ele = wd.find_element_by_css_selector('input[type=file]')
# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')
如果需要上传多个文件,可以多次调用send_keys
ele = wd.find_element_by_css_selector('input[type=file]')
ele.send_keys(r'h:\g01.png')
ele.send_keys(r'h:\g02.png')
模拟鼠标操作
模拟鼠标操作比较常用,可以解决验证码滑动,内嵌的滚动条都可以使用鼠标来模拟操作。ActionChains包
鼠标拖动操作(滑动验证码问题)
drag_and_drop(self, source, target)
#source:鼠标拖动的原始元素
#target:鼠标拖动到的另外一个元素(的位置)
拖动source元素到target元素的位置
drag_and_drop_by_offset(self, source, xoffset, yoffset)
#source:鼠标拖动的原始元素
#xoffset:鼠标把元素拖动到另外一个位置的x坐标
#yoffset:鼠标把元素拖动到另外一个位置的y坐标
拖动source元素到指定的坐标
鼠标悬浮操作
鼠标移动(悬浮)到某个元素之上:move_to_element (element)
#element,要悬浮的元素
ActionChains的其他操作:移动鼠标、右击、双击、结合键盘按键的操作
context_click(element) #右击element元素
double_click(element)#双击element元素
move_by_offset(xoffset,yoffset)#移动鼠标到指定的x,y位置(相对于浏览器的绝对位置)
move_to_element_with_offset(element, xoffset, yoffset)#相对element元素,移动鼠标到指定的x,y位置(相对于element元素的相对位置)
click_and_hold(element1=None) #在element1元素上按下鼠标左键,并保持按下动作(元素默认为空)
release(element2=None)#在element2元素上松开鼠标左键(元素默认为空)
key_down(key , element1=None)#在element1元素上,按下指定的键盘key(ctrl、shift等)键,并保持按下动作(元素默认为空)
key_up(key , element2=None) #在element2元素上,松开指定的键盘key(元素默认为空)
send_keys(key) #向当前定位元素发送某个key键
send_keys_to_element(element ,key) #向element元素发送某个key键
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!