爬虫tips(2)

动态内容

依赖JavaScript的动态网站,不是在第一次加载时下载全部内容,网页中展示的内容并没有出现在HTML源码中

AJAX

Asynchronous JavaScript and XML
综合了多项技术的浏览器端网页开发技术
允许JavaScript创建到服务器的HTTP请求并获得响应

  传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求。服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向服务器发送请求,应用的回应时间依赖于服务器的回应时间。这导致了用户界面的回应比本机应用慢得多。
  与此不同,AJAX应用可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的回应。因为在服务器和浏览器之间交换的数据大量减少(大约只有原来的5%)[来源请求],服务器回应更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web服务器的负荷也减少了。

抓取方式

  • JavaScript逆向工程
  • 渲染 JavaScript

JavaScript逆向工程

所谓逆向工程就是去了解数据的请求链接是什么形式
AJAX数据可以直接请求,我们要做的是构建请求,然后分析返回的结果( 一般是JSON数据——python提供了json模块可以方便地解析response数据
与抽取html再分析相比,这种方式下数据的结构其实更容易抽取
构建请求时利用边界情况进行简化

  1. 提高每个页面的显示数量可以减少下载次数
  2. 尝试利用正则减少请求,使用一次搜索查询就能匹配所有结果

渲染JavaScript

渲染引擎是浏览器在显示网页时解析HTML、应用css样式并执行JavaScript语句的部分
利用Selenium+PhantomJS可以模拟上述行为(Selenium也可以执行JavaScript脚本)没有关注链接构造
轮询网页:判断特定内容有没有出现

比较

前者从长期来看性能和可靠性更高
后者适合作为短期解决方案,不需要我们了解网站的后端工作原理
不足在于渲染网页增加了开销,轮询网页在网络较慢时经常失败

TODO

表单交互