动态网页抓取(网页源代码获取单节点的方法和常见的用法有哪些?)

优采云 发布时间: 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. 异常处理

  尝试除了

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线