今天学习更高级获取网页的方法——使用selenium库。
Selenium可以用于模拟人为操控浏览器,需要先安装驱动。
firefox下载,edge下载,chrome下载(中国大陆无法访问),下载后放在浏览器目录,然后把浏览器目录添加到系统Path中。如果是linux,则放到/usr/loacl/bin
。
from selenium import webdriver
import time
driver = webdriver.Firefox() #创建一个对象
# driver = webdriver.Chrome() chrome对象
# driver = webdriver.Edge() edge对象
driver.get('https://enterdawn.top') # get访问enterdawn.top
time.sleep(2)
driver.quit() #不要忘了关闭
对于一些浏览器,也可以实现无窗口化,以chrome为例:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
chrome_opt = Options() # 创建参数设置对象.
chrome_opt.add_argument('--headless') # 无界面化.
chrome_opt.add_argument('--disable-gpu') # 配合上面的无界面化.
chrome_opt.add_argument('--window-size=1366,768')
driver = webdriver.Chrome(chrome_options=chrome_opt)
基本操作方法也很简单:
方法 | 操作 |
---|---|
driver.set_window_size(480, 800) | 浏览器窗口大小 |
driver.back() | 后退 |
driver.forward() | 前进 |
driver.refresh() | 刷新 |
鼠标操作
下面是一个例子:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains #引入鼠标操作的类
driver = webdriver.Firefox()
driver.get("https://enterdawn.top")
above = driver.find_element_by_link_text("杂谈") # 查找元素
ActionChains(driver).click(above).move_to_element(above).perform() # 先点击,再悬停
perform()加在最后用于执行。
方法 | 操作 |
---|---|
click() | 点击 |
context_click() | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
拖动需要形成动作链:
# 本段代码摘自https://blog.csdn.net/qq_29186489/article/details/78661008
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.common.alert import Alert
browser=webdriver.Firefox()
url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)#切换到目标元素所在的frame
browser.switch_to.frame("iframeResult")#确定拖拽目标的起点
source=browser.find_element_by_id("draggable")#确定拖拽目标的终点
target=browser.find_element_by_id("droppable")#形成动作链
actions=ActionChains(browser)
actions.drag_and_drop(source,target)#执行
actions.perform()
'''
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
'''
t=browser.switch_to_alert()
print(t.text)
t.accept()
time.sleep(10)
browser.close()
键盘操作
键盘操作使用driver.find_element_by_id(“kw”).send_keys(),参数为需要输入的文本或按键。常用按键如下:
方法 | 操作 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键 |
send_keys(Keys.SPACE) | 空格键 |
send_keys(Keys.TAB) | 制表键 |
send_keys(Keys.ESCAPE) | ESC键 |
send_keys(Keys.ENTER) | 回车键 |
send_keys(Keys.CONTROL,’a’) | 全选 |
send_keys(Keys.CONTROL,’c’) | 复制 |
send_keys(Keys.CONTROL,’x’) | 剪切 |
send_keys(Keys.CONTROL,’v’) | 粘贴 |
send_keys(Keys.F1) | F1 |
获取信息
| 方法 | 操作 |
| ———— | ———— |
|driver.title |当前页面title|
|driver.current_url | 当前页面URL|
|driver.find_element_by_class_name(‘nums’).text| 获取结果数目|
获取ID、位置、大小和标签名:
# 本段代码摘自https://blog.csdn.net/qq_29186489/article/details/78661008
from selenium import webdriver
browser=webdriver.Chrome()
url="https://www.zhihu.com/explore"
browser.get(url)
logo=browser.find_element_by_id("zh-top-link-logo")
print(logo)
#id
print(logo.id)
#位置
print(logo.location)
#标签名
print(logo.tag_name)
#大小
print(logo.size)
#属性
print(logo.get_attribute("class"))
#文本值
print(logo.text)
browser.close()
等待
显式等待
需要from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver(驱动对象), 时间, poll_frequency=休眠时间的间隔,默认0.5, ignored_exceptions=超时后的异常信息,默认NoSuchElementException )
例如:result=WebDriverWait(driver,10).until(条件) # 条件出现继续
result=WebDriverWait(driver,10).until_not(条件)# 条件不出现继续
至于条件,我们需要使用expected_conditions模块,可以参考:https://blog.csdn.net/kelanmomo/article/details/82886718
隐式等待
相当于设置全局的等待,在定位元素时,对所有元素设置超时时间:
driver.implicitly_wait(时间)
切换窗口
使用browser.switch_to_window(browser.window_handles[0]),其中的browser.window_handles[0]为窗口列表。
警告框
使用driver.switch_to_alert(),参数如下:
方法 | 操作 |
---|---|
driver.switch_to_alert().accept() | 确定 |
driver.switch_to_alert().dismiss() | 取消 |
driver.switch_to_alert().text | 返回警告框里的文字 |
截图
driver.get_screenshot_as_file("截图保存位置")
文件上传
driver.find_element_by_name("file").send_keys('需要上传的文件位置')
cookie操作
方法 | 操作 |
---|---|
get_cookies() | 获得所有cookie信息 |
get_cookie(name) | 返回key为name的cookie |
add_cookie(包含name:value字典对象) | 添加cookie |
delete_cookie(cookie名称,cookie选项) | 删除某一条cookie |
delete_all_cookies() | 删除所有cookie |