写爬虫之前,我们会先分析目标页面。并不是所有的网页右键查看源代码就可以找到想要的数据,如果没有找到,我们就要考虑下面几种可能的情况(我遇到过的)。

1、ajax+json

ajax+json是最常见的一种页面数据加载方案,因为ajax可以使得页面在没有加载数据的时候加载出页面框架,使得用户“感觉”页面打开的很快,并且可以按需加载页面的图片,页面加载数据大大提升。并且json这种数据形式可以被javascript高效解析,所以被广泛应用。

如何找到这些json数据,使用chrome开发者工具。打开页面之后,右键源代码找不到我们想要的数据,那么数据很可能是通过ajax传递过来的,F12打开开发者工具,切换到“Network”标签下的“XHR”子标签,这时候刷新页面,就可以看到数据通过ajax使用json传递到页面中。


如何在chrome找到json数据

举例:

豌豆公主-面膜列表

2、ajax+json+验证表单

带上验证表单,其实就是为了防爬虫,直接通过json接口来获取数据,效率肯定比通过网页高得多,也会给服务器带来压力,所以有些网站会选择使用js进行一种较难分析的单向算法,将已有信息进行单向加密,当然这些都是在js进行的,所以分析出算法并不难。算了不装逼了,分析出来还是挺难的,因为js文件会非常大,需要下断点找到编码成最后结果之前他是怎样的结构,这样才能使用程序去模拟编码过程。


表单中的“_sig”存储到额就是验证字段

举例:

丰趣海淘-奶粉列表

3、jsonp

jsonp不是一个信息传输协议,是码农们为了绕过“同源策略”开发出的“黑科技”。这里只简单说一下同源策略和jsonp原理。

同源策略:这是浏览器的一个安全策略,支持javascript的浏览器(我也不知道有哪些是不支持的)不允许加载其他网站的文档。同源是指相同协议相同主机(域名)、相同端口,三者缺一不可。

jsonp:利用了<script>标签可以加载非同源数据的特点,将json数据包装成javascript函数,这样就可以使用<script>加载目标js,再解析预定义的函数名,就可以在参数中得到想要查询的数据。jsonp方便了网站和接口服务分开在不同主机的架构,可以在不损失效率的情况下,绕过同源策略。但是也是有缺点的,查询参数只能放在url中,数据的长度被限制。


京东全球购的title为jsonp加载


京东全球购商品列表的价格为jsonp加载

举例:

京东全球购-奶粉列表

4、其他少见情况

  1. 数据在js中,这时候推荐用js引擎解析页面,如果数据简单可以用正则提取。
  2. 数据是json,链接在js中,那么在页面中找到json地址,然后访问json获取数据。
  3. 数据是经过js计算得到的,那么就强烈推荐使用PhantomJS环境了,如果你有兴趣读js,那也不是不可以。
  4. ajax请求到的不是json,是html片段,那就尝试正则和xpath。
最后修改:2021 年 01 月 12 日
如果觉得我的文章对你有用,请随意赞赏