简单动态页面的爬取

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)

大家都在看

  • python中的反射

    python反射简介 所谓反射是指通过字符串的方式获取对象,然后执行对象的属性或方法。在python中一切皆对象,因此我们可以对一切事物进行发射。 关于反射python为我们提供了…

    Linux 2023年6月7日
    092
  • ansible用authorized_key模块批量推送密钥到受控主机实现免密登录

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

    Linux 2023年6月7日
    090
  • Ubuntu2004使用dnsmasq+Clash+Iptables+Ipset

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

    Linux 2023年6月13日
    080
  • jmeter 性能测试 报错信息“address already in use:connect”解决方法

    jmeter性能测试报”address already in use:connect” 报错信息 原因分析: 这个问题的原因是windows端口被耗尽了(默…

    Linux 2023年6月8日
    095
  • Linux中touch和mkdir、vi的区别

    touch:创建空白文档,新增文件 mkdir:创建一个目录 vi:同touch一样,都是创建一个空白文档 举个栗子:touch w;此时创建一个w的空白文档;file w 可以查…

    Linux 2023年6月13日
    074
  • 如何访问github.io类的网站

    上网查找后看到有两种说法: 找到/etc/hosts文件,Windows一般在/Windows/System32/drivers/etc目录下,MAC在/private/etc目录…

    Linux 2023年6月8日
    0108
  • Linux FastDFS安装

    1.0、 fastDFS fastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联网量身定制,充分考虑…

    Linux 2023年6月7日
    075
  • Java — 面向对象

    简介:类是对事物的一种描述,对象则为具体存在的事物。 类的定义: public class 类名 { // 成员变量 访问修饰符 数据类型 变量名; … // 成员方法 访问修…

    Linux 2023年6月8日
    081
  • redis的另一个分支 keydb

    今天无意间发现了redis还有一个分支keydb 是多线程的,貌似在机器内核多的情况下效果比redis效果好 执行这些命令 在这之前先把redis关掉 sudo systemctl…

    Linux 2023年5月28日
    071
  • powershell配置自动补全

    powershell配置自动补全 一、需求: 看到老师上课用mac命令行有自动补全功能,发现真的爽。但是自己的windows powershell不能使用自动补全功能。有了需求,就…

    Linux 2023年6月13日
    0122
  • [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)

    1、效果预览 2、新增逻辑概览 3、tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4、init.py 逻辑介绍 5、upload.ht…

    Linux 2023年6月8日
    0111
  • 画图3D Paint 3D工作区黑屏

    最近不知道画图3D抽什么风,黑屏了。 后来研究很久,发现这货竟然是用独立显卡,集显带不起来。 解决方案是在Nvidia控制面板给他分配独立显卡,不要使用集显,不要使用集显,不要使用…

    Linux 2023年6月13日
    0100
  • dotnet-cnblogs-tool使用与坑

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

    Linux 2023年6月6日
    073
  • Windows 10 多用户同时远程登录

    win服务器版默认是支持多用户登陆的,甚至可以在主机上用不同用户自己远程登陆自己,如window server 2016。 Win10 正常情况下是不允许用户同时远程的,即一个用户…

    Linux 2023年6月14日
    0128
  • 【Redis】单线程理解及可能影响性能的操作

    一. Redis的单线程 二. 可能影响单线程性能的操作 1. bigKey操作 2. 复杂命令 3. 大量key集中过期 4. 淘汰策略 5. 主从全量同步生成RDB 6. AO…

    Linux 2023年5月28日
    0111
  • SpringCloud gateway自定义请求的 httpClient

    本文为博主原创,转载请注明出处: 引用 的 spring cloud gateway 的版本为 2.2.5 ; SpringCloud gateway 在实现服务路由并请求的具体过…

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