这两天投了一家公司的爬虫实习生,笔试题是完成一个爬虫的小需求。网站没有什么反爬的高级技巧。但是有非常常见的,并不是针对我们爬虫的,却让我们新手很难理解的ajax动态加载技术和乍一看不明白的翻页时不变的url。还有一些小坑,特此总结一下。希望大家也能收获一些东西。

1 . 什么是 AJAX ?

AJAX = 异步 JavaScript 和 XML。

AJAX 是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

几个常见的用到ajax的场景。

比如你在逛知乎,你没有刷新过网页,但是你却能看到你关注的用户或者话题有了新动态的消息提示。

还比如,我们在看视频时,可以看到下面的评论没有完全全部加载出来,而是你向下拖动一点,它给你加载一点。

为什么要用到ajax呢?

从上述场景你应该也可以发现它的优点,

第一,方便与用户的交互,不用重新加载整个网页,就可以实现刷新,不用中断用户的行为。你正在看程序员如何找对象呢,此时来个消息推送,整个网页被刷新了,你说你气不气!

第二个呢,还是你在看程序员如何找对象,但是此时通信状况不好啊。回答加载不出来,页面就空白的卡那了,回答加载不出来,你说急不急!那这样咯,先给你看几个回答,在你看的时候我再悄悄的加载其它的数据,那不就解决了吗?就跟吃饭一个道理,你点了一桌子菜,难道菜全做好了再给你上吗?肯定不会的呀,做好一道上一道嘛,对不对。

第三,从服务端的发送过来的ajax数据,体积比较小。浏览器知道怎么渲染它,这样就减轻了服务端的压力,让客户端,也就是浏览器承担了一些任务。

Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据,然后再通过DOM将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式。

XMLHttpRequest对象用于在后台与服务器交换数据,具体作用如下:在不重新加载页面的情况下更新网页

在页面已加载后从服务器请求数据

在页面已加载后从服务器接收数据

在后台向服务器发送数据

ajax不是我们的重点,想深入学习的朋友自行了解,ajax的核心机制XMLHttpRequest去吧。我们爬数据来着的哈。

2. Ajax对爬虫有什么影响?

还是对应着上述的场景,我爬虫肯定要爬取一个完整数据。但是你一次就只教我两种找对象的方法。还不够我举一反三呢,万一其中还有几个段子,那这样的数据不具有完整性,不够全面。但是不滑动浏览器,数据不出来怎么办?

更坑爹是什么,ajax加载出来的数据是通过浏览器渲染给我们的呀,源代码不一定能找到我们要的数据。那该肿么办!浏览器知道怎么加载, 我们不知道呀!

3.如何爬取这样的ajax动态加载的网页。

其实有好多种方法。

1. Selenium + PhantomJs

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。它的作用是和浏览器类似,可以渲染js处理的页面。

selenium是什么呢?它本来是个自动化测试工具,但是被广泛的用户爬虫啊。它是一个工具,这个工具可以用代码操作浏览器。比如控制浏览器的下滑之类。不过我并不是很熟悉,以前了解过一点。

不过,我没用这种方法。为啥呢,因为慢。操作浏览器的时间加起来好多好多了呗,而且又不是没有更好的办法。

2. 自己找,找真实请求。

只要是有数据发送过来,那肯定是有发送到服务器的请求的吧。我们只需找出它悄悄加载出的页面的真实请求在哪发送的。

那这次的需求举例。

我需要拿到它的型号, Part Number。

按照常理,Ctrl + U,查看网页源代码。Ctrl + F,查找型号。

0 条!!! 源代码没有数据。那我们来分析network, 请求在哪咯。

打开开发者工具,快捷键F12,不行就Fn + F12.

标红的1, network, 在其中可以看到服务器加载过来的资源。

标红的2, 是一个过滤器,你可以按照文件格式筛选。

标红的3,是加载过来的具体文件。

我们要做的,就是在服务器发送过来的具体文件中找到我们需要的数据。

在XHR中找到feature-search.ket中,选择response查看它的响应。也是是服务器发过来的json文件的内容。

至于为什么是XHR, 前面已经解释了。往前找。

而我们前面也提到过了XML HttpRequest 是ajax的核心机制。想深入了解的同学请自行查找资料。

再进行初步的筛选后,我们还需自己仔细的查看每个文件的response是否有我们需要的内容。

这是feature-search.ket的response,典型的json的k-v的键值对结构。在截取的一小段json格式的代码中,我们可以看到有我们需要的型号信息, 在k == PARTNUMBER , 对应的value里面。

这里推荐一个json在线校验网址。一个大神告诉我的。在线JSON校验格式化工具(Be JSON)

其实也很好找,我们获得页面必然是有请求,有提交给服务器的数据。from data 就是我们提交的数据。 Request URL: 数据提交的url地址, 我们向这个url去提交数据。

截取其中的response中的部分代码。

"searchInfo": {

"page": 1,

"totalRow": 3321,

"totalNotiRow": 0,

"pageLimit": 10,

"rowLimit": 20,

"rowStart": 0,

"rowEnd": 20,

"rowNum": 0,

"searchType": "",

"searchKey": "",

"searchKeyEnc": "",

"searchSubType": "",

"searchSubKey": "",

"searchStartDate": "",

"searchEndDate": "",

"searchGubunType": "",

"searchGubunType2": "",

"searchGubunType3": "",

"searchGubunType4": "",

"searchGubunType5": "",

"delSeq": null,

"fileUploadSeq": "",

"filExpl": "",

"fileMenuCd": "",

"partNumber": "",

"categoryDepth": 1,

"categoryCd": "CA01",

"attrId": "",

"spSeries": "",

"selectCategory": "",

"totalCategoryRow": 0,

"spCategoryCode": "",

"spPartStyle": null,

"spTabSize": null,

"spNoOfPole": null,

"spPitch": null,

"spWaterProof": null,

"spLanceType": null,

"spSUBSuppliy": null,

"spMountWayApE": null,

"spInterface": null,

"spCodingNColor": null,

"spPinNShape": null,

"spImpedance": null,

"spSoldering": null,

"spConnCombDir": null,

"spFlameLevel": null,

"spGWITMaterAt": null,

"spConntHeight": null,

"spCableConMeth": null,

"spActuatorLctn": null,

"spTabThickness": null,

"spWireRangeMm": null,

"spPlating": null,

"spTermPrezType": null,

"spMaterialMark": null,

"spTerminalType": null,

"spStudSize": null,

"spPermitVolt": null,

"spMainChipset": null,

"spFrequency": null,

"spDcpower": null,

"spLockTConn": null,

"spLockingType": null,

"spSealType": null,

"spOptimumTemp": null,

"spWireRangeAWG": null,

"spConnectorType": null

},

4. 浏览器的地址栏中的URL不变,如何翻页。

相信心细的同学已经发现了。Headers中的request method 中显示我们使用的是POST方法。

而且FROM Data 中有一个参数,page。

我在具体实现时采用的requests库。使用requests.post(), 去post的需要提交的参数即可。这样就可以实现爬虫的自动翻页。

熟悉http协议的同学,应该知道,get 和 post 方法的区别。POST 和 GET

W3school 里面已经讲的很清楚明白了。反正,如果在我们翻页时,或者执行某个页面上的操作,如果在url不变的情况下,数据已经被刷新或者改变,我们就该考虑。采用的POST的方法提交。

像这样,我们在知乎搜索编程,url中可以看到多了编程,说明这是get方法。POST方法比GET更安全。毕竟,没人愿意自己的密码,手机号都显示在浏览器的URL栏中。

到这里,我们对需要爬取的网页的基本规律已经分析的比较清楚了。剩余就是实际上的一些操作了。

总结:

另外在这次的爬取的过程中,发现了产品信号和详情页信息对应的错位情况。

在这里提醒大家,就算在爬取到信息后,也要仔细查看数据的正确性。

考虑到网络中众多的复杂情况,比如产品型号拿到了,需要的详情页信息有可能并不存在。那么我们通过构造产品型号构造的产品详情页的URL,取不到响应的详情信息。

本来是1,2,3,4,5,6,7,8,9 相互对应的,如果 2, 3, 4, 5的详情页信息缺失,就会造成信息对应错位。

毕竟数据方面的工作,一不小心就会造成重大损失。所以,一定在爬取之后核对信息,写代码时,考虑到其他方面的众多因素。

最后附上github源码: github

requests 爬取数据, mysql存储。

另外,爬虫的伙伴们。对人家的服务器,手下留情。。。

python翻页功能url不变_爬取Ajax动态加载和翻页时url不变的网页相关推荐

  1. 如何爬取ajax实时加载多个ts文件的视频

    参考http://blog.sina.com.cn/s/blog_81bdf4030102y4fa.html 尝试的linux环境 1.安装python3,原先安装了python2.7.这里需要ln ...

  2. Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据

    导言 最近由于需求想爬取以下东方财富网的股票数据,但是发现没有想象那么简单,接下来我会讲述一下我遇到的问题以及是如何解决,最后成功的爬出了想要的数据. 查看网页源码 首先我们F12打开东方财富网网页源 ...

  3. 通过爬取天猫商品评论实例分析Python爬取ajax动态生成的数据

    本文主要通过爬取天猫商品kindle的评论为例来说明利用python爬取ajax动态生成的数据的方式,本文使用的工具如下: 工具 chrome浏览器[寻找评论的动态链接] python3.5[执行代码 ...

  4. python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...

    crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...

  5. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 参考文章: (1)关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 (2)https://www. ...

  6. scrapy由浅入深(三) selenium模拟爬取ajax动态页面(智联招聘)

    爬取智联招聘的网址:https://sou.zhaopin.com/?pageSize=60&jl=489&kw=python&kt=3 上一篇博客爬取了前程无忧的职位招聘信息 ...

  7. 爬取通过ajax动态加载的页面(实时监控华尔街见闻资讯与快讯)

    学习了几天如何使用scrapy去爬取静态网站,今天尝试去爬取动态加载的网站.选取的网站是华尔街见闻,文中不会像往常一样大篇幅讲解每一步该如何做,而是探讨如何爬取. 在源代码中无法获得全部数据(有的根本 ...

  8. python爬虫之Ajax动态加载数据抓取--豆瓣电影/腾讯招聘

    动态加载数据抓取-Ajax 特点 1.右键 -> 查看网页源码中没有具体数据 2.滚动鼠标滑轮或其他动作时加载 抓取 1.F12打开控制台,页面动作抓取网络数据包 2.抓取json文件URL地址 ...

  9. render注册一个链接组件_详解vue 动态加载并注册组件且通过 render动态创建该组件...

    基于 iview Tabs 组件实现 功能:为每个 tab 动态创建不同的.特定的组件内容,而不需要大量的 import 组件并进行 component 注册 Index.vue import loa ...

最新文章

  1. 谷歌升级Android分析应用程序
  2. 编程实现 4 条重写规则,可生成半法式和法式
  3. flask 文件上传
  4. html设置按钮样式变为椭圆,css border-radius圆形变为椭圆形,位置:绝对
  5. Windows巡检IIS指标脚本(PowerShell实现)
  6. 酱茄企业官网多端开源小程序源码 v1.0.0
  7. list删除某个元素_java list 删除元素
  8. 放弃吧,Hibernate 4直到4.3.0 Beta1还没有解决Proxool连接池不可用的问题
  9. Unity使用UniWebview插件内嵌H5游戏
  10. svnadmin的使用
  11. macOS多版本虚拟机镜像免费下载(及教程)
  12. vcenter报esxi主机 上行链路网络冗余丢失或网络冗余已降级
  13. 再见2021,2022加油
  14. Surface Pro 4 系统优化全教程及QA
  15. linux下刻录光盘读取不了_如何在Linux下刻录数据光盘
  16. Android APP签名找回终极版
  17. 累加器使用的注意点及自定义累加器
  18. Leecode-SQL 1407. 排名靠前的旅行者
  19. 关于STM32WB55一些测评评价
  20. 通达OA 升级到2015精灵菜单异常的处理(图文)

热门文章

  1. 出价成本计算机软件,正确认识和使用百度竞价推广中的左侧指导价工具
  2. 不为人知的网络编程(九):理论联系实际,全方位深入理解DNS
  3. rowid会变化么_【生活】微信对话框上线搜一搜功能 | 饿了么将增加新功能引吐槽...
  4. 安卓情景模式开发-控制GPS/WIFI/蓝牙/飞行模式/控制静音/音量/振动
  5. photoshop下实现毛笔字
  6. ARC086 E Smuggling Marbles
  7. DOYO网站xss漏洞测试
  8. 色拉英语第3集第2幕: what do yo do ?
  9. mac catalina报错gyp: No Xcode or CLT version detected
  10. 如何选购电子烟?FLOCO乐氪满足你一切需求