关于selenium和phantomjs:
降低selenium的版本
原因 新版本将不再支持phantomjs,所以安装之前的版本
pip install selenium==3.4.3
使用火狐无头或者谷歌无头
火狐无头配置
from selenium.webdriver.firefox.options import Options
options = Options() # 实例化
options.add_argument('-headless') # 无头参数
browser = webdriver.Firefox(executable_path='geckodriver',firefox_options=options) # 声明浏览器
谷歌无头配置
from selenium import webdriver
options=webdriver.ChromeOptions()
options.add_argument('--headless')
driver=webdriver.Chrome(options=options)
下面是一些使用的方法
# 导入包
from selenium import webdriver
# 声明浏览器对象
browser = webdriver.Firefox()
# 访问网址
browser.get('url')
# 查找节点,以便于接下来的操作,比如点击 输入 提交 等
input = browser.find_element_by_id('kw')
browser.find_element_by_class_name()
browser.find_element_by_css_selector()
browser.find_element_by_name()
browser.find_element_by_xpath()
browser.find_element()
browser.find_elements() # 获取多个元素
# 获取节点信息
logo = brower.find_element('')
获取属性:
logo.get_attribute('属性')
获取文本值:
logo.text
获取id 位置 标签名字 大小
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
# 节点交互
# 输入内容
input.send_keys('我什么都不知道')
# 清空文字
input.clear()
# 点击按钮
input.click()
print(browser.current_url) # 当前网页链接
print(browser.get_cookies()) # 当前网页cookies
print(browser.page_source) # 当前网页源码
# 页面前进和后退
# 后退
browser.back()
# 前进
browser.forward()
# cookies
# 获取
get_cookies()
# 添加
add_cookies({'':''})
# 删除
delete_all_cookies()
# 动作链
鼠标拖拽和键盘按键通过另一种方式来执行就是动作链
首先选取一个拖拽的实例,依次选好要拖拽的节点和拖拽到的目标节点,
接着声明ActionChains(borwser) 并赋值给一个变量,
然后通过调用变量的drag_and_drop() 将俩个节点传入进去,最后调用perform()方法执行动作
from selenium.webdriver import ActionChains
first = browser.find_element_by_id('q')
last = browser.find_element_by_id('w')
action = ActionChains(browser)
action.drag_and_drop(first,last)
action.perform()
# 执行javascript
对于某些操作比如下拉进度条 可以通过selenium直接模拟运行javascript
使用execute_scripy()方式实现,将进度条拉到底部
browser.execute_script('window.scrollTo(0,document.body,scrollHeight)')
browser.execute_script("return document.documentElement.outerHTML")
弹出提示框 browser.execute_script('alert("弹出提示框")')
# 切换frame子页面
使用browser.switch_to.frame('iframeResult')切换frame
# 延时等待
原因,get()方法会在网页框架加载结束后执行,此时如果如果获取page_source可能并不是浏览器完全加载完成的页面,
如果某些页面有额外的ajax请求,我们在网页源码中也比一定能成功获取到,所以需要延时等待一定时间确保节点已经加载出来了
隐式等待:
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
当查找节点而节点没用立刻出现的时候,隐式等待将等待一段实际再查找dom
显式等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待
wait = WebDriverWait(browser, 10)
# 查找节点
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
首先引入webdriverwait这个对象,指定最长等待实际,然后调用它的until方法传入要等待条件expected_conditions
当在规定实际时间内节点被成功加载也就是节点被查找到就返回节点,超出就抛出异常
# 选项卡管理
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 打开一个选项卡
browser.execute_script('window.open()')
# 获取选项卡
print(browser.window_handles)
# 切换选项卡
browser.switch_to_window(browser.window_handles[1])
# 选项卡1打开淘宝
browser.get('https://www.taobao.com')
# 切换选项卡
browser.switch_to_window(browser.window_handles[0])
# 选项卡0打开python
browser.get('https://python.org')
# 异常处理
from selenium.common.exceptions import *
# TimeoutException
# NoSuchElementException