Python爬虫之selenium
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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了