动态网页抓取( 访问页面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()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线