简单动态页面的爬取

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

尚未用到,待补充
posted @ 2022-08-13 09:33  dysonkkk  阅读(133)  评论(0编辑  收藏  举报