当前位置: 首页 > news >正文

动态网页数据抓取

动态网页数据抓取

一、网页

1.传统网页:

如果需要更新内容,则需要重新加载网页。

2.动态网页:

使用AJAX则不需要加载更新整个网页,实现部分内容更新。

二、什么是AJAX?

AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。

理解:通过在后台与服务器进行少量数据交换【一般为post请求】,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

比如:百度图片采用的就是Ajax方式加载页面。

Ajax加载页面特点:通过交互产生的数据不会在网页源码中出现,这就表明了我们无法通过python发送请求直接获得这些新出现的数据,那么此时爬虫只能爬取没有通过Ajax交互所产生的数据。假设一个网页是由Ajax动态加载数据的,一共有十页,但是通过Python来获取的话,一般只能获取一页,后续的九页数据均无法直接获得。

Ajax加载页面原理:通过某个接口【可以理解为一个网址】与服务器产生数据交换,从而得到新的数据加载到当前页面上。

Ajax加载页面优势:

1.反爬虫 。对于一些初级爬虫工程师来说,不懂异步加载,总感觉代码全对,但是就是获取不到想要的数据,从而怀疑自己代码有问题,直至怀疑人生。

2.更加方便地回应用户数据,优化用户体验。一个页面经常有相同的内容,如果每次都重复加载一个页面,实际上完全相同的不同也是被重复加载的,浪费响应时间。

Ajax加载页面劣势:

破坏浏览器后退按钮的正常行为。比如一个网页一共有十页,通过动态加载后,十页全部在同一个页面加载出来,但是你想后退到第九页是不可能的事情,所以,浏览器的后退按钮对于这种情况就无效了。

三、爬虫怎么应对Ajax

1.找接口

既然Ajax是通过某个接口【特定网址】与服务器交互的,那么我们只要找到这个接口,再模拟浏览器发送请求就行了。

技术难点:

(1)接口可能有多个。一个网页可能有多个特定的接口进行数据交互,需要我们自己多次尝试寻找,增大了爬虫的难度。

(2)与服务器交互的数据加密,较难破解。在与服务器产生交互式需要发送数据,但是这部分数据是网站开发人员设定的,浏览器发送了什么数据虽然大部分情况下我们能够找得到,但是数据经过了加密,破解起来比较困难。

(3)需要爬虫工程师有较高的js功底。

2.使用selenium模拟浏览器行为

相当于使用代码操控浏览器行为,浏览器能够获得什么数据,我们就能够获得什么数据。

技术难点:

代码量大。

3.两种方式对比

方式优点缺点
分析接口代码量少,性能很高。有的网站接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
selenium模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到,爬虫更稳定。代码量多,性能低。

四、总结:

先分析接口,如果接口简单的话,那就使用接口来获取数据,如果接口复杂的话,那就使用selenium来模拟浏览器行为,获取数据。

万事万物皆有利有弊,一方面快捷方便,必然导致另一方面复杂,所以全凭自己权衡利弊或者成本。


扫描二维码即可参与该课程,解锁更多爬虫知识:

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Selenium环境的配置
  • MSExchangeAL 8331
  • 老铁,了解一下Python吗?
  • Application Error 1000
  • 光学文字识别(OCR)
  • Microsoft Exchange Server 1000
  • 三、基础查询——MySQL数据库之查看列(1)
  • 应用程序池 'DefaultAppPool' 的模板永久性缓存初始化失败 | Active Server Pages 5
  • 5.MySQL数据库之排序检索数据
  • MAD 监视线程无法读取服务的状态,错误“0x80041033” | MSExchangeSA 9099
  • 6.MySQL数据库之过滤数据
  • Exchange 2003 公用文件夹 c1030af7
  • 7.MySQL数据库之数据过滤
  • MySQL中的各种函数
  • W3SVC 1013 IIS进程锁死
  • [PHP内核探索]PHP中的哈希表
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 2017 年终总结 —— 在路上
  • Android 架构优化~MVP 架构改造
  • CAP 一致性协议及应用解析
  • JavaScript新鲜事·第5期
  • Laravel 菜鸟晋级之路
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 初识 beanstalkd
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于List、List?、ListObject的区别
  • 后端_MYSQL
  • 前端攻城师
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 异常机制详解
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • elasticsearch-head插件安装
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #162 (Div. 2)
  • #php的pecl工具#
  • ${factoryList }后面有空格不影响
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C++17) optional的使用
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .Net多线程总结
  • @Bean注解详解
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [2]十道算法题【Java实现】
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android]How to use FFmpeg to decode Android f...
  • [C++] Windows中字符串函数的种类
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CakePHP] 在Controller中使用Helper
  • [hibernate]基本值类型映射之日期类型