一、安装及环境配置
如果要使用selenium,需要下载chrome及对应系统、对应浏览器版本的chromedriver。pip安装:pip install selenium
二、基本使用
2.1 启动及配置
# 普通启动
from selenium import webdriver
# 1. 实例化一个浏览器
browser = webdriver.Chrome(\"./chromedriver\") # 参数为驱动路径
browser.get(\"http://www.baidu.com/\") # 驱动浏览器访问百度
browser.page_source # 获取当前浏览器的html
browser.quit() # 退出实例化的浏览器
# 包含配置信息启动
from selenium import webdriver
# 配置
options = webdriver.ChromeOptions()
options.add_argument(\'--headless\') # 增加无界面选项
options.add_argument(\'--disable-gpu\') # 如果不加这个选项,有时定位会出现问题
options.add_argument(\'--user-data-dir=/Users/mac/Library/Application Support/Google/Chrome/Default\') # 设置成用户自己的数据目录
# 实例化一个浏览器对象,并加载配置
browser = webdriver.Chrome(executable_path=\"./chromedriver\", options=options)
browser.get(\"http://www.baidu.com/\") # 驱动浏览器访问百度
browser.page_source # 获取当前浏览器的html
browser.quit() # 退出实例化的浏览器
2.2 基本浏览器动作
# 定位
browser.find_element_by_id(\"id\") # 通过id定位
browser.find_element_by_name(\"name\") # 通过name定位
browser.find_element_by_class_name(\"class_name\") # 通过classname定位
browser.find_element_by_tag_name(\"input\") # 通过tag标签定位
browser.find_element_by_xpath(\"//input[@id=\'kw\']\") # 通过xpath定位
browser.find_element_by_css_selector(\"#kw\") # 通过CSS方式定位
# 等待
# 1.强制等待x秒
time.sleep(10) # 强制程序休眠10s
# 2.每次都等到浏览器全部加载完成
browser.implicitly_wait(30) # 隐式等待,参数为最长等待时间(s)。页面全部加载完成才会执行下一步操作。
# 需要注意的是,browser.implicitly_wait(30)是为全局设置最长30s的等待时间。
# 3.等到自己需要的元素出现或者自己不需要的元素消失
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(browser, 30).until(EC.title_is(\"百度一下,你就知道\")) # 等待,直到标题是百度一下,或超时
WebDriverWait(browser, 30).until(EC.title_contains(\"百度\")) # 等待,直到标题包含百度,或超时
WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.ID, \"id\"))) # 等待,直到Dom中存在该id
WebDriverWait(browser, 30).until(EC.visibility_of_element_located((By.ID, \"id\"))) # 等待,直到Dom中存在该id并且可见
WebDriverWait(browser, 30).until(EC.element_to_be_clickable((By.XPATH,\"//*[@id=\'u1\']/a[8]\"))) # 等待,直到该元素是可点击的
WebDriverWait(browser, 30).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,\'.main\'),\'enable\')) # 判断.main中是否包含enable字符串,返回布尔值
WebDriverWait(browser, 30).until(EC.staleness_of(driver.find_element(By.ID,\'id\'))) # 等待,直到id从dom中移除
# 行为
browser.maximize_window() # 浏览器最大化
browser.minimize_window() # 浏览器最小化
browser.set_window_size(480, 800) # 自定义浏览器窗口大小
browser.forword() # 浏览器前进
browser.back() # 浏览器后退
browser.close() # 关闭浏览器当前窗口
browser.quit() # 退出浏览器驱动并关闭所有窗口
browser.refresh() # 刷新当前页
browser.page_source # 获取当前页html
browser.title # 获取当前页标题
browser.url # 获取当前页url
browser.find_element_by_name(\"name\").click() # 点击对象
browser.find_element_by_name(\"name\").send_keys(\"keyword\") # 模拟键盘输入
browser.find_element_by_name(\"name\").clear() # 清除对象的内容
browser.find_element_by_name(\"name\").submit() # 提交对象的内容
browser.find_element_by_name(\"name\").text() # 获取元素的文本信息
browser.find_element_by_name(\"name\").context_click() # 右键单击
browser.find_element_by_name(\"name\").double_click() # 双击
browser.find_element_by_name(\"name\").is_displayed() # 是否用户可见
# 模拟键盘事件
from selenium.webdriver.common.keys import Keys
browser.find_element_by_id(\"user_pwd\").send_keys(Keys.ENTER) # 通过定位密码框,enter(回车)来代替登陆按钮
browser.find_element_by_id(\"login\").send_keys(Keys.ENTER) # 点击回车登陆(替代click),和上面效果一样
browser.find_element_by_name(\"name\").send_keys(Keys.CONTROL, \"a\") # 模拟ctrl+a
# iframe
browser.switch_to_frame(\"f1\") # 找到 f1 iframe
browser.switch_to_window(\"f1\") # 找到内嵌窗口 f1
driver.switch_to.frame(driver.find_elements_by_tag_name(\"iframe\")[0])
三、其他使用
# 操作cookie
browser.get_cookie(\"name\") # 根据name获取单个cookie
browser.get_cookies() # 获取所有cookie
browser.delete_all_cookies() # 删除所有cookies
browser.delete_cookie(\"name\") # 根据name删除对应cookie
browser.add_cookie({\"k1\": \"v1\", \"k2\": \"v2\"}) # 设置cookies
# 获取截屏
browser.get_screenshot_as_file(\"/usr/download/down_image.png\") # 保存当前窗口截图
browser.get_screenshot_as_png() # 获取当前png截图的二进制字符串
# 获取窗口信息
browser.get_window_rect() # 获取当前窗口xy坐标及当前窗口的高度和宽度
browser.get_window_position(windowHandle=\"current\") # 获取当前窗口的x,y坐标
browser.get_window_size(windowHandle=\"current\") # 获取当前窗口的高度和宽度
# 多窗口切换
driver.get(\"http://example.com\") # 打开一个窗口
now_handle = drvier.current_window_handle # 获取当前窗口句柄
driver.find_element_by_name(\'example\').click() # 点击某个元素打开新的窗口(target=\"_black\"的元素)
all_handle = drvier.window_handles # 获取所有窗口句柄
drvier.switch_to.window(now_handle) # 切换为第一窗口
driver.close() # 关闭当前窗口
# 通过input上传附件
self.browser.find_element_by_xpath(\'//input[@class=\"file-selector-file\"]\').send_keys(\"/Users/mac/Documents/myspider/selenium_spider/test.mp4\") # 必须要用绝对路径
3.1 切换标签页
每个标签页都有对应的窗口句柄,可以通过窗口句柄切换到对应的标签页。
# 1. 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles
# 2. 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])
3.2 切换iframe
selenium操作iframe内容需要先switch_to到iframe,操作完成后需要切换回来
login_frame = driver.find_element_by_id(\'login_frame\') # 根据id定位 frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中
# 利用切换标签页的方式切出frame标签
windows = driver.window_handles
driver.switch_to.window(windows[0])
3.3 cookie操作
# 获取cookie
cookies_dict = {cookie[\"name\"]: cookie[\"value\"] for cookie in driver.get_cookies()}
# 删除一个cookie
driver.delete_cookie(\"CookieName\")
# 删除所有cookie
driver.delete_all_cookies()
# 添加一个cookie
add_cookie(cookie_dict)
3.4 执行JS代码
script = \'window.scrollTo(0,document.body.scrollHeight)\'
browser.execute_async_script(script, *args) # 在当前的window/frame中异步执行JS代码
browser.execute_script(script, *args) # 在当前的window/frame中同步执行JS代码
script: JS代码(str)
*args: 要传入js的参数(iterable)
3.5 上传文件
通过input上传文件
self.browser.find_element_by_xpath(\'//input[@class=\"file-selector-file\"]\').send_keys(\"/Users/mac/Documents/myspider/selenium_spider/test.mp4\") # 必须要用绝对路径
3.6 截图
browser.get_screenshot_as_file(\"/usr/download/down_image.png\") # 保存当前窗口截图
browser.get_screenshot_as_png() # 获取当前png截图的二进制字符串
3.7 鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
el = driver.find_element_by_name(\'tj_trnews\') # 目标元素
ActionChains(driver).context_click(el).perform() # 右击目标元素
ActionChains(driver).double_click(el).perform() # 双击目标元素
source = driver.find_element_by_id(\'lg\') # 目标元素原始位置
target = driver.find_element_by_id(\'kw\') # 拖动的目标位置
ActionChains(driver).drag_and_drop(source, target).perform() # 拖动元素
ActionChains(driver).move_to_element(el).perform() # 鼠标移动的目标元素上
ActionChains(driver).click_and_hold(el).perform() # 移动到目标元素按下鼠标左键
3.8 控制已打开的浏览器
.\\chrome.exe --remote-debugging-port=6001 --user-data-dir=\"C:\\ProgramFiles\\Chrome\"
def init_driver():
options = webdriver.ChromeOptions()
options.add_experimental_option(\"debuggerAddress\", \"127.0.0.1:6001\")
driver = webdriver.Chrome(options=options)
return driver
四、代码示例
4.1 初始化driver
#!/usr/bin/env python
# coding:utf-8
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
def chromedriver_demo():
driver = webdriver.Chrome()
driver.delete_all_cookies()
driver.add_cookie({\'name\': \'ABC\', \'value\': \'DEF\'})
driver.get_cookies()
driver.execute_script(\'window.open(\"https://www.baidu.com\");\')
\"\"\"
// chrome地址栏命令
about:version - 显示当前版本
about:memory - 显示本机浏览器内存使用状况
about:plugins - 显示已安装插件
about:histograms - 显示历史记录
about:dns - 显示DNS状态
about:cache - 显示缓存页面
about:gpu -是否有硬件加速
about:flags -开启一些插件
chrome://extensions/ - 查看已经安装的扩展
// chrome参数
–user-data-dir=”[PATH]” 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。
–disk-cache-dir=”[PATH]“ 指定缓存Cache路径
–disk-cache-size= 指定Cache大小,单位Byte
–first run 重置到初始状态,第一次运行
–incognito 隐身模式启动
–disable-javascript 禁用Javascript
–omnibox-popup-count=”num” 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。
–user-agent=”xxxxxxxx” 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果
–disable-plugins 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果
–disable-javascript 禁用JavaScript,如果觉得速度慢在加上这个
–disable-java 禁用java
–start-maximized 启动就最大化
–no-sandbox 取消沙盒模式
–single-process 单进程运行
–process-per-tab 每个标签使用单独进程
–process-per-site 每个站点使用单独进程
–in-process-plugins 插件不启用单独进程
–disable-popup-blocking 禁用弹出拦截
–disable-plugins 禁用插件
–disable-images 禁用图像
–incognito 启动进入隐身模式
–enable-udd-profiles 启用账户切换菜单
–proxy-pac-url 使用pac代理 [via 1/2]
–lang=zh-CN 设置语言为简体中文
–disk-cache-dir 自定义缓存目录
–disk-cache-size 自定义缓存最大值(单位byte)
–media-cache-size 自定义多媒体缓存最大值(单位byte)
–bookmark-menu 在工具 栏增加一个书签按钮
–enable-sync 启用书签同步
–single-process 单进程运行Google Chrome
–start-maximized 启动Google Chrome就最大化
–disable-java 禁止Java
–no-sandbox 非沙盒模式运行
\"\"\"
def init_driver(driver_path: str, timeout=20, user_agent: str = None, headless=False,
proxy: str = None, binary_location: str = None, user_data_dir: str = None,
crx_dir=None):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(\"blink-settings=imagesEnabled=false\") # 设置图片不加载
chrome_options.add_argument(\"--disable-gpu\")
chrome_options.add_argument(\"disable-infobars\") # 隐藏\"Chrome正在受到自动软件的控制\"
chrome_options.add_argument(\"lang=zh_CN.UTF-8\") # 设置中文
chrome_options.add_argument(\"window-size=1920x3000\") # 指定浏览器分辨率
chrome_options.add_argument(\"--hide-scrollbars\") # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument(\"--remote-debugging-port=9222\")
# chrome_options.binary_location = r\"/Applications/Chrome\" # 手动指定使用的浏览器位置
if headless:
chrome_options.add_argument(\"--headless\")
if not user_agent:
user_agent = \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.58\"
chrome_options.add_argument(\"user-agent=%s\" % user_agent)
if proxy:
chrome_options.add_argument(\"proxy-server=%s\" % proxy)
if user_data_dir:
chrome_options.add_argument(\"--user-data-dir=%s\" % user_data_dir)
if binary_location:
chrome_options.binary_location = binary_location # 手动指定使用的浏览器位置
if crx_dir:
chrome_options.add_extension(crx_dir) # 自定义加载扩展crx
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=driver_path)
driver.set_page_load_timeout(timeout)
driver.set_script_timeout(timeout)
return driver
def init_driver_with_exists_chrome():
\"\"\"
Start Chrome:
C:\\Users\\user\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe --remote-debugging-port=6001 --user-data-dir=\"C:\\ProgramFiles\\Chrome2\"
\"\"\"
options = webdriver.ChromeOptions()
options.add_experimental_option(\"debuggerAddress\", \"127.0.0.1:6001\")
driver = webdriver.Chrome(options=options)
return driver
def wait_html(driver):
while 1:
time.sleep(0.5)
if \"Certification\" in driver.page_source:
print(\"Success!!! Certification\")
break
print(\"Certification\")
# pass. to do next
def auto_input(driver):
# input keys
driver.find_element_by_xpath(\'//input[@name=\"CMT_SSN_1\"]\').send_keys(\"\")
# click button 1
driver.find_element_by_xpath(\'//input[@name=\"CCA_QUIT_IND\"][@value=\"N\"]\').click()
# click button 2 (with js)
driver.execute_script(\"\"\"
var e = document.createEvent(\"MouseEvents\");
e.initEvent(\"click\", true, true);
document.getElementById(\"nextBtn\").dispatchEvent(e);
\"\"\")
# click button 3
element = driver.find_element_by_id(\'login\')
webdriver.ActionChains(driver).move_to_element(element).click(element).perform()
# selection
Select(driver.find_element_by_xpath(\'//select[@name=\"CMT_ID_TYPE_CD\"]\')).select_by_index(2)
Select(driver.find_element_by_xpath(\'//select[@name=\"CWE_CONTACT_OUTCOME_CD_02\"]\')).select_by_value(\"3\")
if __name__ == \"__main__\":
url = \"https://m.amap.com/service/poi/id.json?id=B0FFH5BLJA\"
driver_path = \"spider_data/chromedriver.exe\"
init_driver(driver_path)
五、参考文章
来源:https://www.cnblogs.com/xyya/p/14709499.html
图文来源于网络,如有侵权请联系删除。