动态网页抓取(网页源代码获取单节点的方法和常见的用法有哪些?)
优采云 发布时间: 2021-11-02 03:29动态网页抓取(网页源代码获取单节点的方法和常见的用法有哪些?)
Selenium 支持多种浏览器:Chrome、Firefox、Edge 等,还支持Android、BlackBerry 等手机浏览器,还支持非接口浏览器PhantomJS。
初始化:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
4. 访问页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com ')
print(browser.page_source) //打印源码
browser.close()
5.查找节点
Selenium 可以驱动浏览器完成各种操作,比如填表、模拟点击等。比如我们要在输入框中输入文本,就必须知道输入框的位置,对吧?别着急,selenium 提供了一系列查找节点的方法。
先看网页源码
如何获取单个节点:
此外,Selenium 还提供了通用方法:
find_element(By.ID, id) 等价于 find_element_by_id(id)
如何获得多个节点:
此外,Selenium 还提供了通用方法:
find_elements(By.ID, id) 等价于 find_elements_by_id(id)
注:单节点和多节点是单复数形式的区别。
6. 节点交互
Selenium 驱动浏览器执行一些操作。其实就是让浏览器模拟并执行一些动作。常见用法有:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com ')
input = browser.find_element_by_id('q') //通过输入框的id,找到输入框(不一定能找到,淘宝的源代码可能更新了)
input.send_keys('iPhone') //在输入框内输入iPhone
time.sleep(1)
input.clear() //清空输入框内容
input.send_keys('Ipad')
button = browser.find_element_by_class_name('btn-search') //查找“搜索”按钮(不一定能找到,淘宝的源代码可能更新了)
button.click()
可以参考官方文档:#module-selenium.webdriver.remote.webelement
7.动作链
上面的例子是针对某个节点执行的,其他一些操作没有具体的执行对象,比如鼠标拖拽、键盘按键等,这些动作是通过另一种方式执行的,也就是动作链。
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)
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()
操作结果:
可以参考官方文档:#mon.action_chains
8. 执行 JavaScript
对于某些操作,不提供 selenium API。比如下拉进度条,可以直接模拟运行JS,本例使用execute_script()方法来实现。
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
通过这种方式,基本上所有API没有提供的功能都可以通过执行JS来实现。
9. 获取节点信息
在前面的代码中,可以通过page_source属性获取网页的源代码,然后可以使用解析库来提取信息。
并且用selenium可以获取节点,返回webElement类型,可以直接获取节点信息(文本、属性等)
get_attribute()
输入文本
每个 WebElement 节点都有一个 text 属性
10. 切换帧
网页中有一种节点叫做iframe,就是子框架,相当于页面的子页面,其结构与外部网页的结构完全相同。selenium打开页面后,他默认在父框架中操作,如果此时页面中有子框架,则无法获取子框架中的节点。这时候就需要使用switch_to.frame()方法来切换Frame。
11. 延迟等待
在 Selenium 中,get() 方法将在页面框架加载后结束执行。这时候如果拿到page_source,可能不是浏览器完全加载的页面。如果某些页面有额外的 Ajax 请求。我们可能无法在网页的源代码中获得它。因此,您需要等待一段时间以确保节点已加载。
等待有两种方式:隐式等待和显式等待。
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10) //隐式等待10秒
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
from selenium import webdriver
from selenium.webdriver.commom.by import By
from selenium.webdriver.support import excepted_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
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_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
可以参考官方文档:#module-selenium.webdriver.supported.expected_conditions
12. 向前和向后
我们在使用浏览器的时候一般都有前进后退的功能,Selenium也可以实现这个功能。
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get ('https://www.taobao.com ')
browser.get ('https://www.python.org ')
browser.get ('https://www.baidu.com ')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
13. 饼干
使用 Selenium 可以方便地对 Cookie 进行操作,例如获取、添加和删除 Cookie。
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url) //加载完成后,实际上已经生成cookies了
print(browser.get_cookies()) //获取所有的cookies
browser.add_cookie({'name': 'name', 'domin':'www.zhihu.com', 'value':'germey'}) //添加cookie,注意cookie的单复数
print(browser.get_cookies()) //再次获取cookies
browser.delete_all_cookies() //删除所有的cookies
print(browser.get_cookies()) //再次获取为空了
14.标签管理
当您访问网页时,将打开一个选项卡。在 Selenium 中,我们可以对选项卡进行操作。
15. 异常处理
尝试除了