动态网页抓取( 查找节点交互Selenium的操作方法及使用方法(二) )

优采云 发布时间: 2021-11-24 23:24

  动态网页抓取(

查找节点交互Selenium的操作方法及使用方法(二)

)

  from selenium import webdriver

browser = webdri ver. Chrome()

browser = webdriver. Firefox()

browser = webdri ver. Edge()

browser = webdriver. PhantomJS()

browser= webdriver.Safari()

# 完成浏览器对象初始化并将其赋值为browser 对象。调用 browser对象,让其执行各个动作以模拟浏览器操作。

  2)访问页面

  from selenium import webdnver

browser = webdriver.Chrome()

browser. get (’https://www.taobao.com’ )

print(browser.page_source)

browser. close()

# 用get()方法来请求网页,参数传入链接URL即可。

  3)查找节点

  # 单个节点

find_element_by_id

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

Selenium提供通用方法find_element(),它需要传入两个参数: 查找方式By和值。find_element(By.ID,id)

from selenium import webdriver

from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get('https://www.taobao.com')

input_first = browser.find_element(By.ID,'q')

print(input_first)

browser.close()

# 多个节点

要查找所有满足条件的节点,需要用find_elements()这样的方法

  4)节点交互

  Selenium 可以驱动浏览器执行一些动作,也就是说浏览器可以模拟一些动作。

  from selenium import webdriver

import time

browser = webdriver.Chrome()

browser.get('https://www.taobao.com')

input = browser.find_element_by_id('q')

# send_keys()方法用于输入文字

input.send_keys('iPhone')

time.sleep(1)

# clear()方法用于清空文字

input.clear()

input.send_keys('iPad')

button = browser.find_element_by_class_name('btn-search')

# click()方法用于点击按钮

button.click()

  5)动作链

  如鼠标拖曳、 键盘按键等,它们没有特定的执行对象,这些动作用另一种方式来执行,那就是动作链。

- 实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处

# 首先,打开网页中的一个拖曳实例,然后依次选中要拖曳的节点和拖曳到的目标节点,接着声明ActionChains对象并将其赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法, 再调用perform()方法执行动作,此时就完成了拖曳操作

from selenium import webdnver

from selenium.webdriver import ActionChains

browser = webdriver.Chrome()

url =’http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'

browser.get(url)

browser.switch_to.frame('iframeResult')

source = browser.find_element_by_css selector('#draggable')

target= browser.find_element_by_css_selector('#droppable' )

actions = ActionChains(browser)

actions.drag_and_drop(source, target)

actions.perform()

  6)JavaScript 执行

  对于某些操作,Selenium API 不提供。比如下拉进度条,可以直接模拟运行JavaScript,

  这时候使用execute script()方法来实现,代码如下:

  from selenium import webdriver

browser= webdriver.Chrome()

browser. get (’https://www.zhihu.com/explore')

browser.execute_script('window.scrollTo(o, document.body.scrollHeight)’)

browser.execute_script('alert(”To Bottom”)')

# 这里就利用execute script()方法将进度条下拉到最底部,然后弹出alert提示框。

  7)获取节点信息

  -获取属性

  # 使用get_attribute()方法来获取节点的属性

from selenium import webdriver

from selenium.webdriver import ActionChains

browser = webdri ver. Chrome()

url = 'https://www.zhihu.com/explore'

browser. get ( url)

logo= browser.find_element_by_id(’zh-top-link-logo’)

print(logo)

print(logo.get_attribute(’class' ))

  - 获取文本值

  from selenium import webdriver

browser= webdriver.Chrome()

url =’https://www.zhihu.com/explore’

browser. get(url)

input = browser.find_element by class name('zu-top-add-question’)

print(input.text)

  - 获取 id、位置、标签名称和大小

  from. selenium import webdnver

browser = webdriver. Chrome()

url =’https://www.zhihu.com/explore'

browser.get (url)

input= browser.find_element_by_class_name(’zu-top-add-question')

print(input.id)    # 节点id

print(input.location)  # 节点页面相对位置

print(input.tag_name)  # 标签名称

print(input.size)   # 节点大小

  8)帧切换

  网页中有一种节点叫做iframe,就是子框架,相当于页面的子页面,它的结构和外部网页的结构完全一样。Selenium 打开页面后,默认在父框架中运行,如果此时页面中有子框架,则无法获取子框架中的节点。这时候就需要使用switch_to.frame()方法来切换Frame。

  import time

from selenium import webdriver

from selenium.common.exceptions import NoSuchElementException

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= browser.find_element_by_class_name('logo')

except NoSuchElementException:

  print(’NO LOGO')

browser.switch_to.parent_frame)

logo = browser. find_element_by_class_name('logo')

print(logo)

print(logo.text)

  首先通过switch_to切换到子Frame。frame() 方法,然后尝试获取父 Frame 中的 logo 节点(无法找到)。如果找不到,它将抛出 NoSuchElementException。异常被捕获后,会输出NO LOGO。接下来切换回父Frame,然后再次获取节点,发现此时可以成功获取。

  - 隐式等待

  在使用隐式等待执行测试时,如果 Selenium 在 DOM 中没有找到节点,它将继续等待。超过设定时间后,会抛出1 No node found 的异常。换句话说,当搜索一个节点并且该节点没有立即出现时,隐式等待会等待一段时间,然后再搜索DOM。默认时间为 0。

  from selenium import webdriver

browser = webdriver.Chrome()

browser.implicitly_wait (10)

browser.get(’https://www.zhihu.com/explore' )

input = browser. find_element_by_class_name(’zu-top-add-question’)

print(input)

  -显式等待

  隐式等待时间被认为是固定的,但页面加载时间会受到网络条件的影响。

  显式等待方法,指定要搜索的节点,然后指定最长等待时间。如果在指定时间内加载节点,则返回搜索到的节点;如果在指定时间内仍未加载节点,则会抛出超时异常。

  # 首先引入WebDriverWait这个对象,指定最长等待时间,然后调用它的until()方法,传入要等待条件expected_conditions。 比如,这里传入了presence_of_element_located这个条件,代表节 点出现的意思,其参数是节点的定位元组,也就是ID为q的节点搜索框。

- 效果:在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点;如果超过10秒还没有加载出来,就抛出异常。

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

browser = webdriver.Chrome()

browser.get(’https://www.taobao.com/’)

wait = WebDriverWait(browser, 10)

input = wait. until(EC. presence_of _element_located( (By. ID,’q’)))

button = wait.until(EC.element to be clickable((By.CSS_SELECTOR,’.btn search')))

print(input, button)

  9)前进后退

  浏览器具有前进和后退功能,它们在 Selenium 中通过 forward() 和 back() 方法实现。

  import time

from selenium import webdnver

browser = webdriver.Chrome()

browser. get (’https://www.baidu.com/’)

browser.get('https://www.taobao.com/’)

browser.get(’https://www.python.org/’)

browser.back()

time.sleep(l)

browser. forward()

browser. close()

  10)饼干

  from selenium import webdriver

browser = webdriver.Chrome()

browser.get('https://www.zhihu.com/explore')

print(browser.get_cookies())

browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})

browser.delete_all_cookies()

  11)标签管理

  import time

from selenium import webdnver

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[l])

browser.get(’https://www.taobao.com')

time.sleep(l)

browser.switch_to_window(browser.window_handles(0))

browser.get(’https://python.org')

  12)异常处理

  from selenium import webdriver

from selenium.common.exceptions import TimeoutException, NoSuchElementExcephon

browser = webdriver.Chrome()

try:

  browser.get('https://www.baidu.com’)

except TimeoutException:

  print(' Time Out')

try:

  browser. find_element_by_id(' hello')

except NoSuchElementException:

  print(’No Element’)

finally:

  browser.close()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线