09-识别网站所用技术
[toc]
1.4.4 识别网站所用技术
构建网站所使用的技术类型也会对我们如何爬取产生影响。有一个十分有用的工具可以检查网站构建的技术类型—— detectem 模块,该模块需要Python 3.5+环境以及Docker。如果你还没有安装Docker,可以遵照 https://www.docker.com/products/overview 中你使用的操作系统所对应的说明操作。当Docker安装好后,你可以运行如下命令。
docker pull scrapinghub/splash
pip install detectem
上述操作将从ScrapingHub拉取最新的Docker镜像,并通过 pip 安装该库。为了确保不受任何更新或改动的影响,推荐使用Python虚拟环境( https://docs.python.org/3/library/venv.html )或Conda环境( https://conda.io/docs/using/envs.html ),并查看项目的ReadMe页面( https://github.com/spectresearch/detectem )。
**为什么使用环境?** 假设你的项目使用了早期版本的库进行开发(比如 `detectem` ),而在最新的版本中, `detectem` 引入了一些向后不兼容的变更,造成你的项目无法正常工作。但是,你正在开发的其他项目中,可能使用了更新的版本。如果你的项目使用系统中安装的 `detectem` ,那么当更新库以支持其他项目时,该项目就会无法运行。 Ian Bicking的 `virtualenv` 为解决该问题提供了一个巧妙的解决方法,该方法通过复制系统中Python的可执行程序及其依赖到一个本地目录中,创建了一个独立的Python环境。这就能够让一个项目安装指定版本的Python库,而不依赖于外部系统。你还可以在不同的虚拟环境中使用不同的Python版本。Conda环境中使用了Anaconda的Python路径,提供了相似的功能。
detectem 模块基于许多扩展模块,使用一系列请求和响应,来探测网站使用的技术。它使用了Splash,这是由ScrapingHub开发的一个脚本化浏览器。要想运行该模块,只需使用 det 命令即可。
$ det http://example.python-scraping.com
[('jquery', '1.11.0')]
我们可以看到示例网站使用了通用的JavaScript库,因此其内容很可能嵌入在HTML当中,相对来说应该比较容易抓取。
detectem 仍然相当年轻,旨在成为Wappalyzer的Python对标版本,Wappalyzer是一个基于Node.js的项目,支持解析不同后端、广告网络、JavaScript库以及服务器设置。你也可以在Docker中运行Wappalyzer。首先需要下载其Docker镜像,运行如下命令。
$ docker pull wappalyzer/cli
然后,你可以从Docker实例中运行脚本。
$ docker run wappalyzer/cli http://example.python-scraping.com
输出结果不太容易阅读,不过当我们将其拷贝到JSON解析器中,可以看到检测出来的很多库和技术。
{'applications':
[{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'Modernizr.png',
'name': 'Modernizr',
'version': ''},
{'categories': ['Web Servers'],
'confidence': '100',
'icon': 'Nginx.svg',
'name': 'Nginx',
'version': ''},
{'categories': ['Web Frameworks'],
'confidence': '100',
'icon': 'Twitter Bootstrap.png',
'name': 'Twitter Bootstrap',
'version': ''},
{'categories': ['Web Frameworks'],
'confidence': '100',
'icon': 'Web2py.png',
'name': 'Web2py',
'version': ''},
{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'jQuery.svg',
'name': 'jQuery',
'version': ''},
{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'jQuery UI.svg',
'name': 'jQuery UI',
'version': '1.10.3'},
{'categories': ['Programming Languages'],
'confidence': '100',
'icon': 'Python.png',
'name': 'Python',
'version': ''}],
'originalUrl': 'http://example.python-scraping.com',
'url': 'http://example.python-scraping.com'}
从上面可以看出,检测结果认为Python和 web2py 框架具有很高的可信度。我们还可以看到网站使用了前端CSS框架Twitter Bootstrap。Wappalyzer还检测到网站使用了Modernizer.js以及用于后端服务器的Nginx。由于网站只使用了JQuery和Modernizer,那么网站不太可能全部页面都是通过JavaScript加载的。而如果改用AngularJS或React构建该网站的话,此时的网站内容很可能就是动态加载的了。另外,如果网站使用了ASP.NET,那么在爬取网页时,就必须要用到会话管理和表单提交了。对于这些更加复杂的情况,我们会在第5章和第6章中进行介绍。
**为什么使用环境?**
假设你的项目使用了早期版本的库进行开发(比如 `detectem` ),而在最新的版本中, `detectem` 引入了一些向后不兼容的变更,造成你的项目无法正常工作。但是,你正在开发的其他项目中,可能使用了更新的版本。如果你的项目使用系统中安装的 `detectem` ,那么当更新库以支持其他项目时,该项目就会无法运行。
Ian Bicking的 `virtualenv` 为解决该问题提供了一个巧妙的解决方法,该方法通过复制系统中Python的可执行程序及其依赖到一个本地目录中,创建了一个独立的Python环境。这就能够让一个项目安装指定版本的Python库,而不依赖于外部系统。你还可以在不同的虚拟环境中使用不同的Python版本。Conda环境中使用了Anaconda的Python路径,提供了相似的功能。