简单动态页面的爬取

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)

大家都在看

  • 2-第一个Django程序

    第一个Django程序 从本章节开始将通过实现一个投票应用程序,来让用户逐步的了解Django。这个程序由两步分组成: 公共站点,允许用户访问进行投票,和查看投票。 站点管理,允许…

    Linux 2023年6月7日
    0115
  • NO.6 HTML+CSS 笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0104
  • 防数据泄露_MySQL库和数据安全

    攻击场景 外部入侵 内部盗取 防御体系建设 参考 在企业安全建设中有一个方向是防数据泄露,其中一块工作就是保障数据库安全,毕竟这里是数据的源头。当然数据库也分不同的种类,不同类型的…

    Linux 2023年6月6日
    0110
  • 多线程/哈希slot/集群

    io多线程 以前的redis是单线程模型,其实就是多路复用机制,知道多路复用的来一波6,我们在架构师课程中讲过,那么netty也有,看过老师相关课程的也应该知道。这里不多说了。 R…

    Linux 2023年5月28日
    0103
  • Linux常用扩展

    目录 ~ ? * [] {} 1. ~ 代表当前用户的home目录 pwd ~$ /home/user/ ls ~$ a touch ~/b ls ~$ a b ~ 等于/home…

    Linux 2023年6月7日
    086
  • linux全新机器环境搭建流程梳理

    软件解压后安装基础指令(复制用):./configure && make && make install ./configure –pr…

    Linux 2023年6月6日
    090
  • 通过配置文件(.htaccess)实现文件上传

    一·什么是服务器配置文件.htaccess许多服务器还允许开发人员在各个目录中创建特殊的配置文件,以便覆盖或添加一个或多个全局设置。例如,Apache 服务器将从一个名为(.hta…

    Linux 2023年6月7日
    080
  • redis安装使用

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务…

    Linux 2023年5月28日
    0101
  • Python 获取字典中的第一个键

    提供两种方法: 使用 list 将字典的 key 转换成列表,然后取第一个元素 [0]。如果想要最后一个 key 的话,就取最后一个元素 [-1]。 >>> my…

    Linux 2023年6月7日
    080
  • 服务管理与通信,基础原理分析

    涉及轻微的源码展示,可放心参考; 一、基础简介 服务注册发现是微服务架构中最基础的能力,下面将从源码层面分析实现逻辑和原理,在这之前要先来看下依赖工程的基础结构,涉及如下几个核心组…

    Linux 2023年6月14日
    0140
  • C++ 多线程按顺序执行函数

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    089
  • Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先,我们需要从官网下载显卡驱动。 [En] First of all, we need to download the v…

    Linux 2023年5月27日
    0101
  • 阿里云函数-爱奇艺签到

    简介 是否支持多账号:是消息推送平台:PUSHPLUS 代码 -*- coding: utf8 -*- import requests,random,string,hashlib,…

    Linux 2023年6月7日
    089
  • Java的jinfo命令使用详解

    jinfo命令简介 jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参…

    Linux 2023年5月27日
    0115
  • Linux命令篇-wc 命令

    wc – print newline, word, and byte counts for each file wc: 统计文件的 字&#…

    Linux 2023年6月13日
    097
  • 数据库主从复制

    主从复制是MySQL中最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库…

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