今天学习更高级获取网页的方法——使用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 作者天涯笨熊 CC BY-NC-SA 4.0。
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