简单动态页面的爬取

ch6&7 动态渲染页面的爬取

  • ajax数据爬取
  • 动态渲染页面的爬取
  • selenium的使用
  • splash的使用

1. ajax数据爬取

ajax数据的爬取主要依靠分析XHR请求,利用resquests库构造响应来完成。

2. 动态渲染页面的爬取

0. intro

动态渲染页面技术不止XHR一种,而在一些情况下利用AJAX的爬取是十分困难的。而模拟浏览器运行的方式就可以很好地解决这一问题。
模拟浏览器的运行方式下,模拟出的浏览器中看到的是什么样,代码爬取的就是什么样,做到了可见即可爬。这样一来便不用管ajax的实现到底有哪些参数。

1. selenium

1. 基本使用方法
  • br = webdriver.browser(): 申明了一个浏览器对象,其中 browser字段是下列中的一个,表示选择相对应的浏览器
  • Chrome
  • Firefox
  • Edge
  • Safari
  • PhantomJS该函数完成了浏览器对象的初始化,并将之赋值给变量br
  • br.get(URLlink): 用于请求网页,URLlink即为需要访问的页面
  • br.close(): 关闭浏览器
2. 对节点进行的操作
  • a. 查找结点对于节点的查找可以按照查到结果的个数分为: 对单个节点的查找, 对多个节点的查找
  • 对单节点的查找
    • br.find_element(By.con, val): 其中 con为选择字段,可以为 id, name, xpath, link_text, partial_link_text, tag_name, class_name, css_selectorval为要传入的参数值。
  • 对多个节点的查找
    • br.find_elements(By.con, val): 参数与单节点的查找一致
  • 单节点查找方法返回值为 WebElement, 多节点查找方法返回值为列表,列表中的元素类型为 WebElement*查找示例
from selenium import webdriver
from selenium.webdriver.common.by import By

br = webdriver.Firefox()
br.get('https://www.baidu.com')
ele = br.find_element(By.ID, 'q')
print(res)
br.close()

按照 ID 属性,找到了ID为 q 的节点并输出。结果如下:

  • b. 操作节点在对结点的操作前,需要先通过查找结点来选定操作的对象。常见的操作有:
  • ele.send_keys('content'): 表示向该节点输入文字
  • ele.clear(): 表示清空输入的文字
  • ele.click(): 表示点击节点
  • c. 动作链动作链与对结点的操作类似,但它不需要选择节点。常见的动作链操作有:鼠标拖拽、键盘按键等。
from selenium import webdriver
from selenium.webdriver imposr ActionChains

br = webdriver.Firefox()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
br.get(url)
br.switch_to.frame('iframeResult')
sou = br.find_element_by_css_selector('#draggable')
tar = br.find_element_by_css_selector('#droppable')
act = ActionChains(br)
act.drag_and_drop(sou, tar)
act.perform()
  • 该url是一个用于测试拖拽测试的页面
  • find_element()方法选择了拖拽的目的地和终点,但是动作链对象本身并没有需要选择节点对象
  • d. 获取节点信息获取节点信息同样也需要首先选中需要操作的节点
  • ele.get_attribute('content'): 获取节点的属性,content为要获取的节点的属性,如 class
  • ele.text: 获取节点的文本内容
  • ele.id: 获取id
  • ele.location: 获取该节点在网页中的相对位置
  • ele.tag_name: 获取该节点的标签名称
  • ele.size: 获取该节点的宽和高
  • e. 对于子页面iframe特殊结点的处理iframe节点是一种特殊的节点,相当于页面的子页面。在父页面中查询节点时,是无法查找到子节点中节点的信息的。这时就需要使用切换父子页面的方法
  • br.switch_to.frame('name'): 切换至该页面的子页面,且子页面的名称为 name
  • br.switch_to.parent_frame(): 切换至该页面的父页面
3. 其他操作
  • a. 延时等待selenium中的get方法会在网页框架加载完毕后就执行,如果此时就获取源代码可能会找不到需要的节点,所以需要等待一段时间后再获取代码。
  • 隐式等待
    • br.implicitly_wait(num): 在查找节点而没有找到时等待 num秒。与 br.get()方法搭配使用,且在该方法之前使用。
  • 显式等待
  • b. 前进与后退
  • br.back()
  • br.forward()
  • c. cookies
  • br.get_cookies(): 获取所有cookies
  • br.add_cooke({dic}): 添加一个cookies,传入内容为字典
  • br.delete_all_cookies(): 删除所有cookies
  • d. 异常处理常用的异常及其处理如下
try:
    br.get('http://www.baidu.com')
except TimeoutException:
    print('time out')
try:
    br.find_element_by_id('hello')
except NoSuchElementException:
    print('no such element found')
finally:
    br.close()

2. splash

尚未用到,待补充

Original: https://www.cnblogs.com/dysonxxxxx/p/16582049.html
Author: dysonkkk
Title: 简单动态页面的爬取

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578852/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球