动态网页抓取( 访问页面3.查找节点1.节点操作查找的元素 )
优采云 发布时间: 2021-12-06 21:07动态网页抓取(
访问页面3.查找节点1.节点操作查找的元素
)
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
2.访问页面
from selenium import webdriver
#操作谷歌浏览器
browser = webdriver.Chrome()
#打开网站
browser.get("http://www.baidu.com")
#输出页面的源代码
print(browser.page_source)
#关闭浏览器
browser.close()
3.查找节点1.单节点
from selenium import webdriver
#操作谷歌浏览器
browser = webdriver.Chrome()
#打开网站
browser.get("http://www.baidu.com")
#查找元素三种方式,
#查找元素
input_first = browser.find_element_by_id("kw")
#选择器查找
input_second = browser.find_element_by_css_selector("#kw")
#xpath方式查找
input_third = browser.find_element_by_xpath('//*[@id="kw"]')
#输出
print(input_first,input_second,input_third)
#输出页面的源代码
print(browser.page_source)
#关闭浏览器
browser.close()
2.多节点1.节点操作
如果搜索元素唯一,则单个节点有效,但多个节点需要多个节点
from selenium import webdriver
from selenium.webdriver.common.by import By
#操作谷歌浏览器
browser = webdriver.Chrome()
#打开网站
browser.get("http://www.taobao.com")
#查找元素
lis = browser.find_elements_by_css_selector('.service-bd li')
#也可以使用通用方法
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
#输出页面的源代码
print(browser.page_source)
#关闭浏览器
browser.close()
2.节点交互
Selenium 可以驱动浏览器执行一些操作,也就是说浏览器可以模拟一些动作。
更多操作:
from selenium import webdriver
import time
#打开浏览器
browser = webdriver.Chrome()
url = "http://www.baidu.com"
browser.get(url)
#找到输入框
input = browser.find_element_by_id("kw")
#输入
input.send_keys("草泥马")
#等待1s
time.sleep(1)
#清除
input.clear()
input.send_keys("多么可爱")
#点击百度一下按钮
button = browser.find_element_by_class_name("s_btn")
button.click()
查看代码
3.动作链
仅仅点击和输入是不够的。您还需要模拟鼠标拖动、键盘按键等。
更多动作链:
from selenium import webdriver
#导入动作链
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
#打开网站
browser.get(url)
<br />#框架iframe的id
browser.switch_to.frame('iframeResult')
#找到起点和终点
source = browser.find_element_by_css_selector("#draggable")
target = browser.find_element_by_css_selector("#droppable")
#浏览器加载动作链
actions = ActionChains(browser)
#创建起始位置和终点位置路径
action.drag_and_drop(source,target)
#执行拖拽
actions.perform()
webDriver 只能识别和定位一页上的元素。无法直接定位 frame/iframe 表单的嵌入页面上的元素。这时候就需要通过switch_to.frame()方法将当前定位的主题切换到iframe窗体内部。嵌入页面。
4.执行 JavaScript
对于某些操作,不提供 selenium API。比如下拉进度条,可以直接模拟运行JavaScript,这时候用
可以实现 execute_script() 方法。
from selenium import webdriver
#导入动作链
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.zhihu.com/explore"
#打开网站
browser.get(url)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("到底端了")')
5.获取节点信息1.获取属性
from selenium import webdriver
#导入动作链
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.baidu.com"
#打开网站
browser.get(url)
#找到logo id的节点
logo = browser.find_element_by_id("lg")
#输出属性
print(logo)
print(logo.get_attribute('class'))
查看代码
2.获取文本
获取文本相当于Beautifulsoup的get_text(),pyquery的text()
from selenium import webdriver
#导入动作链
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.baidu.com"
#打开网站
browser.get(url)
#找到logo id的节点
btn = browser.find_element_by_class_name("s_btn")
#文本
print(btn.text)
3.获取id、位置、标签名称和大小
from selenium import webdriver
#导入动作链
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.baidu.com"
#打开网站
browser.get(url)
#找到logo id的节点
btn = browser.find_element_by_class_name("s_btn")
#获取id 位置 标签名和大小
print(btn.id)
print(btn.location)
print(btn.tag_name)
print(btn.size)
6.切换帧
我们知道有一种节点叫做iframe,就是子框架,相当于页面的子页面。它
的结构与外部网页的结构完全相同。selenium 打开页面后,默认为父框架
操作,此时如果页面中有子帧,则无法获取子帧中的节点。这一刻
您需要使用 switch_to.frame() 方法来切换 Frame
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
#启动webdriver
browser = webdriver.Chrome()
#访问地址
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
#打开网址
browser.get(url)
#进入框架
browser.switch_to.frame('iframeResult')
try:
#找到元素类名为logo
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print('No Logo')
#切换到父级frame
browser.switch_to.parent_frame()
#找到类名为logo
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
7.延迟等待
在 Selenium 中,get() 方法将在网页框架加载后结束执行。这时候如果得到page_source,可能不是浏览器完全加载的页面。如果某些页面有额外的 Ajax 请求,我们可以使用该页面的源代码 可能无法成功获取。因此,需要延迟等待一定的时间,以确保节点已经加载完毕。
1)隐式等待
使用隐式等待执行测试时,如果selenium在DOM中没有找到节点,就会继续等待。超过设置的时间后,会抛出找不到节点的异常。换句话说,当搜索到节点并且节点没有立即出现时,隐式等待会等待一段时间,然后才会搜索到DOM。默认时间为 0
from selenium import webdriver#启动webdriver
browser = webdriver.Chrome()
#访问地址
url = "http://www.zhihu.com/explore"
#使用implicitly_wait实现隐式等待
browser.implicitly_wait(10)
browser.get(url)
input = browser.find_element_by_class_name('ExploreHomePage-ContentSection-header')
print(input)
2)显式等待
隐式等待的效果其实并没有那么好,因为我们只指定了一个固定的时间,页面加载时间会受到网络条件的影响。还有一种更合适的显式等待方法,它指定要搜索的节点,然后指定最大等待时间。如果在指定时间内加载节点,则返回搜索到的节点;如果在指定时间内仍未加载节点,则抛出超时异常
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
##from selenium.common.exceptions import NoSuchElementException
#启动webdriver
browser = webdriver.Chrome()
#访问地址
url = "http://www.taobao.com/"
browser.get(url)
#引入WebDriverWait对象,指定最长等待时间
wait = WebDriverWait(browser,10)
#使用until()方法传入等待条件,节点
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
#使用until()方法传入按钮可点击
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input,button)
显式等待和隐式等待有什么区别?
8.前进后退
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.get("http://www.taobao.com")
browser.get("http://www.zhihu.com")
#返回
browser.back()
time.sleep(1)
#前进
browser.forward()
browser.close()
9.饼干
使用 selenium,您还可以方便地操作 cookie,例如获取、添加和删除 cookie。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
#打印cookie
print(browser.get_cookies())
#添加cookie
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
#获取cookie
print(browser.get_cookies())
#删除cookie
browser.delete_all_cookies()
print(browser.get_cookies())
10.标签管理
当您访问网页时,将打开一个选项卡。在selenium中,我们也可以对tabs进行操作
import time
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])
browser.get("https://www.taobao.com")
#等待
time.sleep(1)
#转到第一个选项卡
browser.switch_to_window(browser.window_handles[0])
browser.get("https://python.org")
11.异常处理
在使用selenium的过程中,难免会遇到一些异常,比如timeout,node not found等错误。一旦发生此类错误,程序将不会继续执行。在这里我们可以
使用 try except 语句捕获各种异常。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get("https://www.baidu.com")
except TimeoutException:
print("超时")
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print("没有此节点")
finally:
browser.close()