利用Selenium实现动态渲染页面的爬取------Selenium的使用

上一篇博客中讲到了Selenium的安装和一些简单的语法细则,那么这篇博客接着讲Selenium的语法。

动作链

 在网页中,有的地方需要连续的动作来完成,比如:鼠标拖拽,键盘按键等操作,这时动作链就起到了作用。

实例:鼠标拖拽

from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Edge()

url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)

browser.switch_to.frame("iframeResult")

scoure = browser.find_element_by_css_selector("#draggable")
target = browser.find_element_by_css_selector("#droppable")

actions = ActionChains(browser)
actions.drag_and_drop(scoure,target)
actions.perform()

解析:

首先引入from selenium.webdriver import ActionChains

actions = ActionChains(browser)------动作的开始标志
actions.drag_and_drop(scoure,target)------动作的把内容
actions.perform()------动作执行

 这其中要说明一下网页的节点---iframe节点,

此节点的作用可以理解为在网页中嵌套一个网页

具体的代码实例截图:

利用browser.switch_to.frame("iframeResult")可切换到这个iframe中,然后执行其他操作

获取节点属性

上一篇博客中讲到利用Selenium可以获得实时的网页源代码,Selenium提供好了选择节点的方法,返回类型是WebElemen类型,我们可以通过WebElemen的方法来获得属性和文本值。

获取属性

element.get_attribute("src")

获取文本值 

element.get_text()

 页面等待

在Selenium中,get()方法会在网页框架加载完成后结束执行,此时如果获取page_source,可能并不是浏览器完全加载出来的界面。如某些页面有额外的Ajax请求,我们在网页源代码中也不一定能获得,所以,我们需要等一段时间,确保所有的节点都已经加载出来了。这种等待的当时有两种,一种是隐式等待,一种是显式等待。

隐式等待

使用隐式等待时,如果没有在页面中找到节点,将继续等待,超出时间设定的时间后,则抛出找不到节点的异常。

实例代码:

from selenium import webdriver

browser = webdriver.Edge()
browser.implicitly_wait(10)

browser.get("https://www.zhihu.com/explore")
input1 = browser.find_element_by_class_name("zu-top-add-question")
print(input1)

browser.implicitly_wait(10)------这句话就是隐式等待10秒,默认是0秒

显示等待

这种方法指定要查找的节点,然后制定一个最长的等待时间,如果在规定的时间内找到了这个节点,就返回这个节点,否则就返回超时异常。

实例代码:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


browser = webdriver.Edge()
browser.get("https://www.taobao.com")

wait = WebDriverWait(browser,10)
input1 = wait.until(EC.presence_of_element_located((By.ID,"q")))

print(input1)

首先引入WebDriverWait这个对象,然后利用这个对象的until()方法,传入期待的条件,这个实例的效果就是,如果这个在10秒之内找到了ID为q的节点,则立刻返回这个节点,否则抛出异常。

前进和后退

 浏览器的前进和后退的功能:

browser.back()------后退

browser.forward()------前进

浏览器选项卡管理

 在浏览器中打开多个界面

实例代码:

from selenium import webdriver

browser = webdriver.Edge()

browser.get("https://www.baidu.com")
browser.execute_script("window.open()")
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[0])

browser.close()

browser.window_handles------浏览器的窗口句柄

browser.switch_to.window(browser.window_handles[0])------对浏览器的窗口的切换

 总结

 这篇博客大致说明了一下Selenium的用法,有错误的地方欢迎指出!

有兴趣的小伙伴可以一起交流学习!

猜你喜欢

转载自blog.csdn.net/yanzhiguo98/article/details/86705054