1.6 分析网站

1.6.1 robots.txt与Sitemap简介

一般而言,网站都会提供自己的robots.txt文件,正如1.5节中介绍,Robots协议旨在让网站访问者(或访问程序)了解该网站的信息爬取限制。在用户的程序爬取网站之前,检查这一文件中的内容可以降低爬虫程序被网站的反爬虫机制封禁的风险。下面是百度的robots.txt中的部分内容,可以通过访问www.baidu.com/robots.txt来获取:

robots.txt文件没有标准的“语法”,但网站一般都遵循业界共有的习惯。文件第一行内容是User-agent:,表明哪些机器人(程序)需要遵守下面的规则,后面是一组“allow:”和“disallow:”,决定是否允许该User-agent访问网站的这部分内容。星号“*”为通配符。如果一个规则后面跟着一个矛盾的规则,则以后一条为准。可见,百度的robots.txt对Googlebot和MSNBot给出了一些限制。robots.txt可能还会规定Crawl-delay,即爬虫抓取延迟,如果在robots.txt中发现有“Crawl-delay:5”的字样,那么说明网站希望你的程序能够在两次下载请求中给出5s的下载间隔。

用户可以使用Python 3自带的robotparser工具来解析robots.txt文件并指导爬虫,从而避免下载Robots协议不允许爬取的URL。只要在代码中用“import urllib.robotparser”导入这个模块即可使用,详见例1-2。

【例1-2】robotparser.py,使用robotparser工具。

在上面的程序中,我们打算爬取淘宝网,先看看它的robots.txt中的内容,访问“www.taobao.com/robots.txt”即可获取(由于商业性网站更新频率很高,网站的robots.txt文件地址可能已经更新)。

对于Baiduspider这个用户代理,淘宝网限制不允许爬取网站页面,因此,执行刚才的示例程序,输出的结果会是:

而如果淘宝网的robots.txt中的内容是:

那么若将程序代码其中的:

改为:“https://www.taobao.com/article”,则输出结果就变为:

这说明程序运行成功。

Python 3中的robotparser是urllib下的一个模块,因此先导入它,在下面的代码中,首先创建了一个名为rp的RobotFileParser对象,之后rp加载了对应网站的robots.txt文件,将user_agent设为“Baiduspider”后,使用can_fetch方法测试该用户代理是否可以爬取URL对应的网页。当然,为了让这个功能在真正的爬虫程序中实现,需要一个循环语句不断检查新的网页,类似这样的形式:

有时候robots.txt还会定义一个Sitemap,即站点地图。所谓的站点地图(或者叫网站地图),可以是一个任意形式的文档,一般而言,站点地图中会列出该网站中的所有页面,通常采用一定的格式(如分级形式)。这有助于访问者以及搜索引擎的爬虫找到网站中的各个页面,因此,网站地图在SEO(Search Engine Optimization,搜索引擎优化)领域扮演了很重要的角色。

提示:什么是SEO?SEO是指在搜索引擎的自然排名机制的基础上,对网站进行某些调整和优化,从而改进该网站在搜索引擎结果中的关键词排名,使得网站能够获得更多用户流量的过程。而站点地图(Sitemap)能够帮助搜索引擎更智能高效地抓取网站内容,因此完善和维护站点地图是SEO的基本方法之一。对于国内网站而言,百度SEO是站长做好网站运营和管理中的重要一环。

可以进一步检查这个文件。下面是豆瓣网的robots.txt中定义的Sitemap,可访问www.douban.com/robots.txt来获取(由于豆瓣官方可能对robots.txt更新,下面使用的Sitemap地址也可能发生变动。读者也可尝试其他网站的Sitemap,如耐克官网中robots.txt记录的Sitemap:https://www.nike.com/robots.txt)。

Sitemap(站点地图)可帮助爬虫程序定位网站的内容,打开其中的链接,内容见图1-20。

图1-20 豆瓣网Sitemap链接中的部分内容

由于网站规模较大,Sitemap以多个文件的形式给出,下载其中的一个文件(sitemap_updated.xml)并查看其中内容,见图1-21。

图1-21 豆瓣sitemap_updated.xml中的内容

观察可知,在这个网站地图文件中提供了豆瓣网站最近更新的所有网页的链接地址,如果我们的程序能够有效地使用其中的信息,那么无疑会成为爬取网站的有效策略。

1.6.2 网站技术分析

目标网站所用的技术会成为影响爬虫程序策略的一个重要因素,俗话说:知己知彼,百战不殆,可以使用wad模块来检查网站背后所使用的技术类型(请注意,由于操作系统及其版本的不同,读者安装和运行该wad命令工具时的输出可能也有所不同。如果出现运行报错,可能是操作系统版本不兼容所致,读者可使用其他方法来对网站进行分析,如调查后台JavaScript代码或联系网站管理员等),也可以十分简便地使用pip来安装这个库:

安装完成后,在终端中使用“wad-u url”这样的命令就能够查看网站的分析结果。比如看www.baidu.com背后的技术类型:

输出结果如下,数据使用的是JSON格式:

从上面的结果中不难发现,该网站使用了PHP语言和jQuery技术(jQuery是一个十分流行的JavaScript框架)。由于对百度的分析结果有限,可以再试试其他网站,这一次直接编写一个Python脚本,见例1-3(由于wad版本的更新,下方的示例代码输出可能会有所不同)。

【例1-3】wad_detect.py

这几行代码接受一个url输入并返回wad分析的结果,如输入http://www.12306.cn/,得到的结果是:

根据这样的结果可以看到,12306购票网站使用Java编写,并使用了Java Servlet等框架。

提示:JSON(JavaScript Object Notation)是一种轻量级数据交换格式,JSON便于人们阅读和编写,同时也易于机器进行解析和生成,另外,JSON采用完全独立于语言的文本格式,因此成为一种被广泛使用的数据交换语言。JSON的诞生与JavaScript密切相关,不过目前很多语言(当然,也包括Python)都支持对JSON数据的生成和解析。JSON数据的书写格式是:名称/值。一对“名称/值”包括字段名称(双引号中),后面写一个冒号,然后是值,如:"firstName":"Allen"。JSON对象在花括号中书写,可以包含多个名称/值对。JSON数组则在方括号中书写,数组可包含多个对象。在以后的网络爬取中可能还会遇到JSON格式数据的处理,因此有必要对它作一些了解。有兴趣的读者可以在JSON的官方文档上阅读更详细的说明。

1.6.3 网站所有者信息分析

如果想要知道网站所有者的相关信息,除了在网站中的“关于”或者“About”页面中查看之外,还可以使用WHOIS协议来查询域名。所谓的WHOIS协议,就是一个用来查询互联网上域名的IP和所有者等信息的传输协议。其雏形是1982年互联网工程任务组(Internet Engineering Task Force, IETF)的一个有关ARPANET用户目录服务的协议。

WHOIS的使用十分方便,可以通过pip安装python-whois库,在终端运行命令:

安装完成后使用“whois domain”这样的格式查询即可,比如查询yale.edu(耶鲁大学官网)的结果,执行命令“whois yale.edu”:

输出的结果如下(部分结果):

不难看出,这里给出了域名的注册信息(包括地址),网站管理员以及域名服务器等相关信息。不过,如果在爬取某个网站时需要联系网站管理者,一般网站上都会有特定的页面给出联系方式(Email或者电话),这可能会是一个更为直接方便的选择。

1.6.4 使用开发者工具检查网页

如果想要编写一个爬取网页内容的爬虫程序,在动手编写之前,最重要的准备工作可能就是检查目标网页了。一般会先在浏览器中输入一个URL地址并打开这个网页,接着浏览器就会将HTML渲染出美观的界面效果。如果目标只是浏览或者单击网页中的某些内容,正如一个普通的网站用户那样,那么做到这里就足够了,但遗憾的是,对于爬虫编写者而言,还需要更好地研究一下手头的工具——你的浏览器,这里建议读者使用Google Chrome或Firefox浏览器,这不仅是因为它们的流行程度比较高,更是因为它们都为开发者提供了强大的功能,是爬虫编写时的不二之选。

下面以Chrome为例,看看如何使用开发者工具。可以单击菜单→更多工具→开发者工具,也可以直接在网页内容中右键并单击“检查”元素。开发者工具见图1-22。

图1-22 Chrome开发者工具

Chrome的开发者模式为用户提供了下面几组工具:

●Elements:允许用户从浏览器的角度来观察网页,可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。

●Network:可以看到页面向服务器请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。

●Sources:源代码面板主要用来调试JavaScript。

●Console:控制台可以显示各种警告与错误信息,在开发期间,用户可以使用控制台面板记录诊断信息,或者使用它作为Shell在页面上与JavaScript交互。

●Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事件来提高页面的运行时性能。

●Memory:这个面板可以提供比Performance更多的信息,如跟踪内存泄露。

●Application:检查加载的所有资源。

●Security:安全面板可以用来处理证书问题等。

另外,通过切换设备模式可以观察网页在不同设备上的显示效果,见图1-23。

图1-23 在Chrome开发者模式中将设备切换为iPhone后的显示

在Element模块下,用户可以检查和编辑页面的HTML与CSS,选中并双击元素就可以编辑元素了,比如将百度贴吧首页导航栏中的部分文字去掉,并将部分文字变为红色,效果见图1-24。

图1-24 通过Chrome开发者工具更改贴吧首页内容

当然,也可以选中某个元素后右键单击查看更多操作,见图1-25。

图1-25 Chrome开发者工具选中元素后的右键菜单

值得一提的是上面右键菜单中的Copy XPath选项,由于XPath是解析网页的利器,因此Chrome中的这个功能对于爬虫程序编写而言就显得十分实用方便了。

使用Network工具可以清楚地查看网页加载网络资源的过程和相关信息,请求的每个资源在Network表格中显示为一行,对于某个特定的网络请求,可以进一步查看请求头、响应头、已经返回的内容等信息。对于需要填写并发送表单的网页而言(比如执行用户登录操作),在Network面板中勾选Preserve log,然后进行用户登录,就可以记录下HTTP POST信息,查看发送的表单信息详情。用户在贴吧首页开启开发者工具后再登录,就可以看到这样的信息(见图1-26)。

图1-26 使用Network查看登录表单

其中的Form Data就包含着向服务器发送的表单信息详情。

提示:在HTML中,<form>标签用于为用户输入创建一个HTML表单。表单能够包含input元素,如文本字段、单选/复选框、提交按钮等,一般用于向服务器传输数据,是用户与网站进行数据交互的基本方式。

当然,Chrome等浏览器的开发者工具还包含着很多更为复杂的功能,在这里就不一一赘述了,等到需要用到的时候再去学习即可。