动态网页抓取( 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")')