文章目录
一、安装 selenium
pip install selenium
注意: 使用该模块时需要下载驱动,注意驱动版本与浏览器版本需要一致
Chrome驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
火狐驱动下载地址:http://ftp.mozilla.org/pub/firefox/releases/
基本使用
from selenium import webdriver
driver = webdriver.Chrome(驱动路径) # 实例化对象
driver.get(网页URL) # 加载页面
driver.close() # 关闭浏览器一个Tab
# or
driver.quit() # 关闭浏览器窗口
二、selenium 定位
method | 说明 |
---|---|
find_element_by_name | 通过元素name定位 |
find_element_by_id | 通过元素id定位 |
find_element_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | 通过完整超链接定位 |
find_element_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | 通过标签定位 |
find_element_by_class_name | 通过类名进行定位 |
find_element_by_css_selector | 通过css选择器进行定位 |
如果要定位的元素有多个,那么可以把element改为elements,这样就可以匹配多个元素了。 |
注意:建议使用xpath语法进行查找,这样可以使得准确率更高
xpath语法
(1)标签定位
- 在xpath表达式中最左侧的
/
表示是从根节点进行层级定位 - 在xpath表达式中最左侧的
//
表示可以从任意位置进行定位 - 在xpath表达式中非最左侧的
//
表示是多个层级的意思 - 属性定位:
//tagName[@class="attrname"]
- 索引定位:
//tagName/li[3]
(2) 提取数据
- 取文本
/text()
取直系的文本内容//text()
取所有的文本内容
- 取属性
tag/@attrname
三、selenium 控制浏览器操作
设置浏览器大小
set_window_size(480,800) # 设置浏览器的宽、高
控制浏览器的后腿、前进
driver = webdriver.Chrome(驱动路径)
driver.forward() # 前进
driver.quit() # 退出
driver.back() # 后退
driver.refresh() # 刷新网页
四、selenium 常用用法
获取网页源码
driver.page_source
清除文本
driver.clear()
模拟点击
模拟点击一般配合标签单位来实现点击事件
driver.find_element_by_id('tag_id').click()
input框输入本文
driver.find_element_by_tag_name('input').send_key('输入的内容')
获取标签的大小、尺寸、文本内容
driver = webdriver.Chrome('../../PYTools/chromedriver87.exe')
time.sleep(2)
driver.get('https://www.baidu.com/')
content = driver.find_element_by_id('s-top-left').text # 获取文本内容
size = driver.find_element_by_id('s-top-left').size # 获取标签的大小
attr = driver.find_element_by_id('s-top-left').get_attribute('id') # 获取标签的其他属性
title_img =driver.find_element_by_id('s-top-left').location # 获取标签坐标
截图、保存图片
location
定位标签
crop
截图,以像素点坐标为依据
get_screenshot_as_file(filename)
截取当前窗口,并保存图片指定位置
# 左下角,右上角 定位标签位置
location = title_img.location
rangle = (int(location['x'])-2, int(location['y'])-2, int(location['x'] + size['width']), int(location['y'] + size['height']))
frame = i.crop(rangle) # 截图
frame.save(img_name1) # 保存图片
driver.get_screenshot_as_file(filename)
五、selenium 鼠标键盘事件
对于鼠标和键盘事件需要导入一个动作链
from selenium.webdriver.common.action_chains import ActionChains
鼠标事件
补充:
click_and_hold(block).perform()
按下滑动块
perform()
执行链中的所有动作
release(on_element=None)
在某个元素位置松开鼠标左键
click()
模拟点击
# 百度鼠标悬浮更多标签
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome('../../Tools/chromedriver.exe')
driver.get('http://www.baidu.com')
tag = driver.find_element_by_name('tj_briicon')
ActionChains(driver).move_to_element(tag).perform()
键盘事件
导入包
from selenium.webdriver.common.keys import Keys
Keys类常用方法
六、设置元素等待
显示等待
等待一定条件发生后再进行一步执行代码
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver,10,0.5,ignored_exceptions=None)
# driver 对象
# 10 超时时间
# 0.5 刷新时间,检测间隔时间
# ignored_exceptions 超时后的异常信息
隐式等待
10秒持续定位元素,若定位成功则继续执行,若超过10秒未定位到元素,则抛出异常。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome('../../Tools/chromedriver.exe')
driver.get('http://www.baidu.com')
driver.implicitly_wait(10)
七、frame切换 & 下拉框
frame 切换
driver.switch_to.frame(' id | name属性 | frame个数数字') # 三种定位方式
先通过xpath定位元素再切换
xf = driver.driver.find_element_by_name('tag_name_attr')
driver.switch_to.frame(xf)
跳回最外层页面
driver.switch_to.default_content()
以豆瓣登录为例
......
def slide(driver):
"""滑动验证码"""
# 默认为0,在点击登录时会弹出一个frame,此时这个frame时第二个,所以用1来确定
driver.switch_to.frame(1)
#找到滑块
block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
#找到刷新
reload = driver.find_element_by_xpath('//*[@id="reload"]')
代码参考原文链接:https://blog.csdn.net/qq_16146103/article/details/109180320
下拉框选择
select_by_value
以select中的value为依据
from selenium import webdriver
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome('../../Tools/chromedriver.exe')
driver.get('http://www.baidu.com')
driver.implicitly_wait(10)
tag = driver.find_element_by_name('tj_briicon')
Select(tag).select_by_value('value值')
Select(tag).select_by_index('下拉索引')
八、调用JavaScript代码
windows.scrollTo(0,450)
使浏览器向下移动450像素
js = "window.scrollTo(0,450);"
driver.execute_script(js)
九、selenium 配置浏览器模式
取消Chrome的安全下载提示
driver = webdriver.Chrome('chromedriver.exe',) # 谷歌浏览器
# 取消chrome下载文件的安全提示
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
# downloadPath : 指定下载路径
params = {'cmd': 'Page.setDownloadBehavior',
'params': {'behavior': 'allow', 'downloadPath': r'C:\Users\RION\Desktop\test'}}
driver.execute("send_command", params)
设置为无头模式
from selenium.webdriver.chrome.options import Options
option = Options()
option.add_argument('--headless')
driver = webdriver.Chrome('chromedriver.exe',chrome_options=option)
driver.get('http://www.baidu.com')
设置代理
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument("--proxy-server=http://127.0.0.1:8888")
driver = webdriver.Chrome('chromedriver.exe',chrome_options=option)
其他常用浏览器设置
chrome_options.add_argument('--start-maximized')#浏览器最大化
chrome_options.add_argument('--window-size=1280x1024') # 设置浏览器分辨率(窗口大小)
chrome_options.add_argument('log-level=3')
chrome_options.add_argument('--user-agent=""') # 设置请求头的User-Agent
chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('--disable-javascript') # 禁用javascript
chrome_options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
chrome_options.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化。
调试用例
# 不加载图片,加快访问速度
ch_options.add_experimental_option("prefs", {"profile.mamaged_default_content_settings.images": 2})
# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
ch_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# ch_options.add_experimental_option("debuggerAddress", "127.0.0.1:9999")
ch_options.add_argument('--proxy--server=127.0.0.1:8080')
ch_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
ch_options.add_argument('--incognito')
browser = webdriver.Chrome(options=ch_options)