首页 > 技术文章 > Python爬虫之selenium

jingzh 2021-08-15 21:23 原文

1 selenium

1.1 selenium简介

Selenium是一个 Web 的自动化测试工具,类型像我们玩游戏用的按键精灵,它支持所有主流的浏览器
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截 屏,或者判断网站上某些动作是否发生
Selenium可以便捷的获取网站中动态加载的数据,也可以便捷地实现模拟登陆
Selenium模块:基于浏览器自动化的模块

1.2 selenium环境

先安装环境pip install selenium,然后下载对应浏览器的驱动版本
各个浏览器对应的selenium

浏览器 驱动 WebDriver API
Chrome ChromeDriver.exe selenium-chrome-driver-3.141.59.jar
IE IEDriverServer.exe selenium-ie-driver-3.141.59.jar
Edge msedgedriver.exe selenium-edge-driver-3.141.59.jar
Firefox geckodriver.exe selenium-firefox-driver-3.141.59.jar

谷歌浏览器:http://chromedriver.storage.googleapis.com/index.html
IE浏览器:http://selenium-release.storage.googleapis.com/index.html
谷歌不同浏览器对应版本,按照chrome版本对应的driver,在谷歌浏览器70版本后,直接按照浏览器版本去找对应的driver(只对应大版本就行),如下是70版本之前的对应版本映射

chromedriver版本 支持的Chrome版本
v2.44 v69-71
v2.43 v69-71
v2.42 v68-70
v2.41 v67-69
v2.40 v66-68
v2.39 v66-68
v2.38 v65-67
v2.37 v64-66
v2.36 v63-65
v2.35 v62-64
v2.34 v61-63
v2.33 v60-62
v2.32 v59-61
v2.31 v58-60
v2.30 v58-60
v2.29 v56-58
v2.28 v55-57
v2.27 v54-56
v2.26 v53-55
v2.25 v53-55
v2.24 v52-54
v2.23 v51-53
v2.22 v49-52
v2.21 v46-50
v2.20 v43-48
v2.19 v43-47
v2.18 v43-46
v2.17 v42-43
v2.13 v42-45
v2.15 v40-43
v2.14 v39-42
v2.13 v38-41
v2.12 v36-40
v2.11 v36-40
v2.10 v33-36
v2.9 v31-34
v2.8 v30-33
v2.7 v30-33
v2.6 v29-32
v2.5 v29-32
v2.4 v29-32

1.3 selenium基本操作

由于360浏览器也是使用谷歌内核,因此使用360浏览器来进行代码测试
操作前需要先实例化一个浏览器对象,编写基于浏览器自动化的操作代码:

  • 发起请求:浏览器对象.get(url)
  • 标签定位:浏览器对象.find系列方法
  • 执行js程序:浏览器对象.execute_script(js脚本)
  • 前进:浏览器对象.forward()
  • 后退:浏览器对象.back()
  • 关闭浏览器:浏览器对象.quit()
  • 截屏:浏览器对象.save_screenshot('保存截图名')

标签交互:

  • 发送文字:元素对象.send_keys('xxx')
  • 点击按钮:元素对象.click()
from selenium.webdriver.chrome.options import Options  
from selenium import webdriver  
import time 
#此处是浏览器地址(可以是360浏览器(谷歌内核)或者谷歌浏览器)
__browser_url = r'D:\SoftWare-NeedSoftWare\360\360Browser\360se6\Application\360se.exe' 
chrome_options = Options()
chrome_options.binary_location = __browser_url  
#获取浏览器实例对象
driver = webdriver.Chrome(chrome_options=chrome_options,executable_path='./chromedriver.exe')#此处地址是chromer驱动地址
driver.get('https://www.baidu.com/')#发起请求
search_input=driver.find_element_by_id('q')
search_input.send_keys("asfs")
#点击搜索按钮
bth=driver.find_element_by_css_selector('.bth-search')#标签定位
bth.click()#点击按键的动作
time.sleep(3)  
driver.quit()#关闭浏览器

1.4 selenium处理iframe

如果目标页面内有子页面,可以使用iframe进行操作,即如果当前标签如div被包含在了iframe标签中,可以理解为嵌套在页面中了,就不能直接获取该div标签,需要使用浏览器对象的switch_to.frame()方法切换到div标签所在的iframe标签

比如,直接使用浏览器对象.find_element_by_id()方法会报错找不到该标签,就先使用switch_to.frame处理下:

__browser_url = r'D:\SoftWare-NeedSoftWare\360\360Browser\360se6\Application\360se.exe' 
chrome_options = Options()
chrome_options.binary_location = __browser_url 
driver = webdriver.Chrome(chrome_options=chrome_options,executable_path='./chromedriver.exe')#此处地址是chromer驱动地址
driver.switch_to.frame('xxx')
div_obj=driver.find_element_by_id('div')

1.5 selenium动作链

使用selenium的时候,会遇到悬停后点击元素的操作,因此需要一个动作链来完成这个功能
动作链拖动是一系列操作,首先需要导包from selenium.webdriver import ActionChains
然后实例化一个动作对象:action=ActionChains(浏览器对象)
长按且点击操作:click_and_hold(元素对象)
偏移位置量:move_by_offset(x,y)
动作链立即执行:perform()
释放动作链对象:release()
iframe和selenium示例如下:

from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options

  
chrome_options = Options()
__browser_url = r'E:\SoftWare-Tools\Google-Browser\Google\Chrome\Application\chrome.exe '  ##浏览器的地址
chrome_options.binary_location = __browser_url
driver = webdriver.Chrome(chrome_options=chrome_options,executable_path='./chromedriver.exe')

driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

driver.switch_to.frame('iframeResult')#切换到浏览器标签定位的作用域
div = driver.find_element_by_id('draggable')

#动作链
action=ActionChains(driver)
action.click_and_hold(div)

for i in range(5):
    action.move_by_offset(17,0).perform()#perform是立即执行的方法
    sleep(0.3)
action.release()
driver.quit()

1.6 无头浏览器和规避检测

所谓无头浏览器,就是使用selenium没有浏览器页面,更加方便脚本运行;规避检测的作用是有些浏览器会阻碍selenium脚本对网站的访问而进行限制
导包

实现不可视化界面
from selenium.webdriver.chrome.options import Options
实现规避检测
from selenium.webdriver import ChromeOptions

示例如下:

from selenium import webdriver
from time import sleep
#实现不可视化界面
from selenium.webdriver.chrome.options import Options
#实现规避检测
from selenium.webdriver import ChromeOptions

#不可视化界面
chrome_options = Options()
__browser_url = r'E:\SoftWare-Tools\Google-Browser\Google\Chrome\Application\chrome.exe '  ##浏览器的地址
chrome_options.binary_location = __browser_url
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#规避检测
option=ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])

driver = webdriver.Chrome(chrome_options=chrome_options,options=option,executable_path='./chromedriver.exe')

driver.get('https://www.baidu.com')
print(driver.page_source)
sleep(2)
driver.quit()

推荐阅读