来源:未知
点击: 次
这两天投了一家公司的爬虫实习生,笔试题是完成一个爬虫的小需求。网站没有什么反爬的高级技巧。但是有非常常见的,并不是针对我们爬虫的,却让我们新手很难理解的ajax动态加载技术和乍一看不明白的翻页时不变的网站如何被百度收录。还有一些小坑,特此总结一下。希望大家也能收获一些东西。
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
几个常见的用到ajax的场景。
比如你在逛知乎,你没有刷新过网页,但是你却能看到你关注的用户或者话题有了新动态的消息提示。
还比如,我们在看视频时,可以看到下面的评论没有完全全部加载出来,而是你向下拖动一点,它给你加载一点。
为什么要用到ajax呢?
从上述场景你应该也可以发现它的优点,
第一,方便与用户的交互,不用重新加载整个网页,就可以实现刷新,不用中断用户的行为。你正在看程序员如何找对象呢,此时来个消息推送,整个网页被刷新了,你说你气不气!
第二个呢,还是你在看程序员如何找对象,但是此时通信状况不好啊。回答加载不出来,页面就空白的卡那了,回答加载不出来,你说急不急!那这样咯,先给你看几个回答,在你看的时候我再悄悄的加载其它的数据,那不就解决了吗?就跟吃饭一个道理,你点了一桌子菜,难道菜全做好了再给你上吗?肯定不会的呀,做好一道上一道嘛,对不对。
第三,从服务端的发送过来的ajax数据,体积比较小。浏览器知道怎么渲染它,这样就减轻了服务端的压力,让客户端,也就是浏览器承担了一些任务。
Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据,然后再通过DOM将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式。
XMLHttpRequest对象用于在后台与服务器交换数据,具体作用如下:
ajax不是我们的重点,想深入学习的朋友自行了解,ajax的核心机制XMLHttpRequest去吧。我们爬数据来着的哈。
还是对应着上述的场景,我爬虫肯定要爬取一个完整数据。但是你一次就只教我两种找对象的方法。还不够我举一反三呢,万一其中还有几个段子,那这样的数据不具有完整性,不够全面。但是不滑动浏览器,数据不出来怎么办?
更坑爹是什么,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中找到中,选择response查看它的响应。也是是服务器发过来的json文件的内容。
至于为什么是XHR, 前面已经解释了。往前找。
而我们前面也提到过了XML HttpRequest 是ajax的核心机制。想深入了解的同学请自行查找资料。
再进行初步的筛选后,我们还需自己仔细的查看每个文件的response是否有我们需要的内容。
这是的response,典型的json的k-v的键值对结构。在截取的一小段json格式的代码中,我们可以看到有我们需要的型号信息, 在k == PARTNUMBER , 对应的value里面。
这里推荐一个json在线校验网址。一个大神告诉我的。
其实也很好找,我们获得页面必然是有请求,有提交给服务器的数据。from data 就是我们提交的数据。 Request URL: 数据提交的url地址, 我们向这个url去提交数据。
截取其中的response中的部分代码。
相信心细的同学已经发现了。Headers中的request method 中显示我们使用的是POST方法。
而且FROM Data 中有一个参数,page。
我在具体实现时采用的requests库。使用(), 去post的需要提交的参数即可。这样就可以实现爬虫的自动翻页。
熟悉http协议的同学,应该知道,get 和 post 方法的区别。
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存储。
另外,爬虫的伙伴们。对人家的服务器,手下留情。。。