ccran 的个人博客 ccran 的个人博客

记录精彩的程序人生

目录
爬虫之内容篇
/  

爬虫之内容篇

爬虫之内容篇

emmm,最近又做了下爬虫,总结一波爬取内容的方法,也就是纯粹将内容爬下来,暂时不过多考虑反爬、效率等问题。

1. 基本步骤

  1. 对需要爬取的数据进行分析(需要爬哪些信息)
  2. 分析HTTP请求、抓包(如何爬取这些信息)
  3. 选择合适的框架与工具进行内容的提取、格式化以及持久化(写代码爬取信息并保存)

2. 入门内容爬取

入门级别的内容通常是服务端通过模板方式将内容直接渲染到了网页上。

一般在网页上右击查看网页源代码可以直接看到需要爬取的内容。

以如下的用户列表为例,可以在网页源码中找到用户信息:

入门.png

这种形式的内容,通过HTTP请求拿到页面后即可解析。

通用爬虫框架一般都提供了方便的工具,包括但不限于XPath、CSS选择器、正则表达式等工具来完成内容的提取。

3. 普通内容爬取

普通级别的内容一般是接触最多的。

3.1 AJAX

网页数据通过AJAX方式访问服务端接口获取

以如下用户列表为例,查看网页源代码找不到用户信息。

不过可以看到JS脚本通过AJAX异步加载了userList接口的数据,并且将数据填充到了tbody元素中。

ajax.png

如果是Chrome,可以打开控制台,切换到Network标签页,刷新页面,然后分析网络请求。

可以看到userList接口返回的JSON数据,由于JSON是格式化好的数据,因此相比于提取HTML网页更为方便。

chromeconsole.png

3.2 简单编码或加密

网页数据经过简单的JS加密或者编码

以爬取dict.cn的释义常用度分布图为例。

chart.png

观察可以发现data属性中存在percent、sense英文字符串

%7B%221%22%3A%7B%22percent%22%3A70%2C%22sense%22%3A%22%5Cu4f1f%5Cu5927%5Cu7684%22%7D%2C%222%22%3A%7B%22percent%22%3A12%2C%22sense%22%3A%22%5Cu91cd%5Cu8981%5Cu7684%22%7D%2C%223%22%3A%7B%22percent%22%3A9%2C%22sense%22%3A%22%5Cu5f88%5Cu597d%5Cu7684%22%7D%2C%224%22%3A%7B%22percent%22%3A6%2C%22sense%22%3A%22%5Cu5927%5Cu91cf%5Cu7684%22%7D%2C%225%22%3A%7B%22percent%22%3A3%2C%22sense%22%3A%22%5Cu7f8e%5Cu597d%5Cu7684%22%7D%7D

首先对其进行URL解码

{"1":{"percent":70,"sense":"\u4f1f\u5927\u7684"},"2":{"percent":12,"sense":"\u91cd\u8981\u7684"},"3":{"percent":9,"sense":"\u5f88\u597d\u7684"},"4":{"percent":6,"sense":"\u5927\u91cf\u7684"},"5":{"percent":3,"sense":"\u7f8e\u597d\u7684"}}

然后通过Unicode解码后就可以得到需要提取的数据

{"1":{"percent":70,"sense":"伟大的"},"2":{"percent":12,"sense":"重要的"},"3":{"percent":9,"sense":"很好的"},"4":{"percent":6,"sense":"大量的"},"5":{"percent":3,"sense":"美好的"}}

3.3 多端接口

网页页面数据复杂加密,但是提供多端接口,如移动端接口

如果需要爬取的内容源提供了多端访问,比如提供移动端APP

此时可以尝试使用Fiddler进行抓包,分析网络请求。

以金山词霸APP抓包为例,可以看到APP通过HTTPClient请求了index.php接口,并返回了APP所需要的JSON数据。

ciba.png

分析得到金山词霸单词基本信息URL:

http://dict-mobile.iciba.com/interface/index.php?c=word&list=300&client=1&timestamp=1576058483&sign=f8141173b7aff9c5&uuid=4da1fefcec7747278f0b27941b9bd2f3&sv=android6.0.1&v=10.5.2&uid=&word=单词名称

分析得到金山词霸单词柯林斯信息URL:

http://dict-mobile.iciba.com/interface/index.php?c=word&list=300&client=1&timestamp=1576058483&sign=f8141173b7aff9c5&uuid=4da1fefcec7747278f0b27941b9bd2f3&sv=android6.0.1&v=10.5.2&uid=&word=单词名称

3.4 通用

网页页面数据复杂加密,查看元素内容与要爬取的内容一致

通过Selenium模拟浏览器请求数据,但是速度很慢,耗费资源也多。

4. 困难内容爬取

网页页面数据复杂加密,查看元素内容与要爬取的内容不一致,毫无头绪

1)对网页来说,分析JS代码。对APP来说,反编译分析代码。

2)网页截图+OCR+机器学习

3)我选择放弃

5. 总结

  1. 尽量选择最简单的爬取方法,如分析拿到AJAX请求。首先数据格式化更简单,而且速度更快,资源消耗更少。
  2. 慎用爬虫。
  3. 平安夜快乐!

标题:爬虫之内容篇
作者:ccran
地址:https://ccran.online/articles/2019/12/24/1577190817792.html