动态网页抓取( 2.访问页面使用get_attribute查找节点用get方法(组图) )

优采云 发布时间: 2021-11-29 14:19

  动态网页抓取(

2.访问页面使用get_attribute查找节点用get方法(组图)

)

  from selenium import webdriver

chrome = webdriver.Chrome()

  这样初始化后,当使用它进行浏览器操作时,会弹出浏览器界面,直到关闭。显然我们希望它在后台静默工作而不弹出任何界面,所以我们还需要设置chrome的无界面模式(旧版本可能不支持):

  from selenium.webdriver.chrome.options import Options

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('--disable-gpu')

chrome = webdriver.Chrome(chrome_options=chrome_options)

  2. 访问页面

  访问页面,使用get函数传入url:

  chrome.get('https://www.baidu.com')

print(chrome.page_source) # 输出当前页面源码

  3. 查找节点

  使用get方法打开一个页面后,可以使用page_source方法获取其源码,然后使用BeautifulSoup等库进行解析,但是selenium已经提供了一系列操作节点的方法,所以不需要额外使用解析库。

  可以通过find_element_by_id等方法获取id、class等通用属性的节点。获取单个节点的方法有:

  find_element_by_tag_name()

find_element_by_id()

find_element_by_name()

find_element_by_class_name()

  另外,还有一个通用的查找节点的方法find_element(attribute name, value),可以灵活的查找自定义属性的节点。以上方法都是获取单个节点的方法。如果页面中有多个符合条件的节点,则只能返回第一个结果。如果要查找所有符合条件的节点,只需将方法中的元素改为元素即可。, 这将返回一个节点列表。

  4. 获取节点信息

  定位到一个节点后,可以使用get_attribute('attribute name')方法获取其属性信息,获取节点的内容可以使用.txt方法:

  node = chrome.find_element_by_id('kw')

print(node.get_attribute('class'))

print(node.text)

  5. 节点交互

  Selenium 为节点提供了一系列的操作方法,比如在输入框中填写:

  input = chrome.find_element_by_id('kw')

input.send_keys('python') # 填入内容

input.clear() # 清空输入

input.send_keys('zzu')

  点击指定按钮:

  button = chrome.find_element_by_id('su')

button.click()

  6. 延迟等待

  在打开一个页面时,可能是网络问题导致的或者页面需要加载大量动态信息,在立即操作页面时可能会出现错误。因此,最好在打开页面后稍等片刻再继续。最简单的等待方法是使用时间库。:

  显然这种方法很不灵活,大多数页面都可以快速加载,这样固定的延迟会浪费很多时间。更好的方法是使用WebDriverWait类,用浏览器对象和最大等待时间初始化,然后调用until方法,传入等待条件。如果达到最大等待时间,则等待立即结束,否则会抛出异常,例如:

  from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait

# 5秒内id为content_left的节点出现则结束等待,否则抛出异常

WebDriverWait(chrome, 5).until(EC.presence_of_element_located(('id', 'content_left')))

  完整的等待条件可以查看官方文档

  7. 执行 JavaScript 代码

  Selenium 提供了一种直接运行 JavaScript 代码的方法,excute_script。Selenium 没有提供的动作可以通过执行 JavaScript 代码来实现,比如下拉进度条加载更多内容:

  # 下拉进度条到最底部

chrome.execute_script('window.scrollTo(0, document.body.scrollHeight)')

chrome.execute_script('alert("to bottom")')

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线