Selenium爬取元素定位

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行

JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转

、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器  

  Selenium提供了一下方法来定义一个页面中的元素:

find_element_by_id

find_element_by_name
find_element_by_xpath              #根据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                   #根据css选择器选取

  下面是查找多个元素(这些方法将返回一个列表):

find_elements_by_name

find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
 
find_element_by_css_selector
  
  查id find_element_by_css_selector(#id)
  查class           find_element_by_css_selector(.class)
  查tag              find_element_by_css_selector(tag)

   selenium获取其他属性方法

get_attribute
  获取文字    find_element_by_css_selector('#setf').get_attribute('textContent')
  获取innerhtml    find_element_by_css_selector('#setf').get_attribute('innerHTML')
  获取连接地址    find_element_by_css_selector('#setf').get_attribute('href')

交互

  send_keys()         输入文字

  clear()          清空文字

  click()          点击动作

执行JavaScript

  Selenium API并没有提供。比如,下拉进度条,它可以直接模拟运行JavaScript,

  此时使用execute_script()方法即可实现

  1. browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
  2. browser.execute_script('alert("123")')

动作链

  实例中,一些交互动作都是针对某个节点执行的。比如,对于输入框,我们就调用它的输入文字和清空文字方法;

  对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象,比如鼠标拖曳、键盘按键等,

  这些动作用另一种方式来执行,那就是动作链。

  比如,现在实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处,可以这样实现:

  

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
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.click_and_hold(source)
time.sleep(3)
for i in range(5):
    actions.move_by_offset(xoffset=17,yoffset=0).perform()
    time.sleep(0.5)
actions.release()

 

原文地址:https://www.cnblogs.com/sunny666/p/10615803.html