在这个大数据时代,尤其是人工智能浪潮兴起的时代,不论是工程领域还是研究领域,数据已经成为必不可少的一部分,而数据的获取很大程度上依赖于爬虫的爬取,所以爬虫变得越来越火爆。
什么是爬虫?
我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。
怎么学爬虫?
在学习写爬虫之前,我们需要了解一些基础知识,如 HTTP 原理、网页的基础知识、爬虫的基本原理、Cookies 的基本原理等。本文,我们就对这些基础知识做一个简单的总结。
在本节中,我们会详细了解 HTTP 的基本原理,了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容,有助于我们进一步了解爬虫的基本原理。
一、URI 和 URL
这里我们先了解一下 URI 和 URL,URI 的全称为 Uniform Resource Identifier,即统一资源标志符,URL 的全称为 Universal Resource Locator,即统一资源定位符。
举例来说, 是 GitHub 的网站图标链接,它是一个 URL,也是一个URI。即有这样的一个图标资源,我们用 URL/URI 来唯一指定了它的访问方式,这其中包括了访问协议 https、访问路径(/即根目录)和资源名称 favicon.ico。通过这样一个链接,我们便可以从互联网上找到这个资源,这就是 URL/URI。
URL 是 URI 的子集,也就是说每个 URL 都是 URI,但不是每个 URI 都是 URL。那么,怎样的URI 不是 URL 呢?URI 还包括一个子类叫作 URN,它的全称为 Universal Resource Name,即统一资源名称。URN 只命名资源而不指定如何定位资源,比如 urn:isbn:0451450523 指定了一本书的 ISBN,可以唯一标识这本书,但是没有指定到哪里定位这本书,这就是 URN。URL、URN 和 URI 的关系可以用图 1 表示。
图1 URL、URN 和URI 关系图
但是在目前的互联网中,URN 用得非常少,所以几乎所有的 URI 都是 URL,一般的网页链接我们既可以称为 URL,也可以称为 URI,我个人习惯称为 URL。
二、超文本
接下来,我们再了解一个概念——超文本,其英文名称叫作 hypertext,我们在浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列 HTML 代码,里面包含了一系列标签,比如 img 显示图片,p 指定显示段落等。浏览器解析这些标签后,便形成了我们平常看到的网页,而网页的源代码 HTML 就可以称作超文本。
例如,我们在 Chrome 浏览器里面打开任意一个页面,如淘宝首页,右击任一地方并选择“检查”项(或者直接按快捷键 F12),即可打开浏览器的开发者工具,这时在 Elements 选项卡即可看到当前网页的源代码,这些源代码都是超文本,如图 2 所示。
图2 源代码
三、HTTP 和HTTPS
在淘宝的首页中,URL 的开头会有http 或https,这就是访问资源需要的协议类型。有时,我们还会看到ftp、sftp、smb 开头的URL,它们都是协议类型。在爬虫中,我们抓取的页面通常就是http 或https 协议的,这里首先了解一下这两个协议的含义。
HTTP 的全称是Hyper Text Transfer Protocol,中文名叫作超文本传输协议。HTTP 协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。HTTP 由万维网协会(World Wide Web Consortium)和Internet 工作小组IETF(Internet Engineering Task Force)共同合作制定的规范,目前广泛使用的是HTTP 1.1 版本。
HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单讲是HTTP 的安全版,即HTTP 下加入SSL 层,简称为HTTPS。
HTTPS 的安全基础是SSL,因此通过它传输的内容都是经过SSL 加密的,它的主要作用可以分为两种。
建立一个信息安全通道来保证数据传输的安全确认网站的真实性,凡是使用了HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA 机构颁发的安全签章来查询
现在越来越多的网站和App 都已经向HTTPS 方向发展,例如:
苹果公司强制所有iOS App 在2017 年1 月1 日前全部改为使用HTTPS 加密,否则App 就无法在应用商店上架谷歌从2017 年1 月推出的Chrome 56 开始,对未进行HTTPS 加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”腾讯微信小程序的官方需求文档要求后台使用HTTPS 请求进行网络通信,不满足条件的域名和协议无法请求
而某些网站虽然使用了HTTPS 协议,但还是会被浏览器提示不安全,例如我们在Chrome 浏览器里面打开12306,链接为:,这时浏览器就会提示“您的连接不是私密连接”这样的话,如图3 所示。
图3 12306 页面
这是因为12306 的CA 证书是中国铁道部自行签发的,而这个证书是不被CA 机构信任的,所以这里证书验证就不会通过而提示这样的话,但是实际上它的数据传输依然是经过SSL 加密的。如果要爬取这样的站点,就需要设置忽略证书的选项,否则会提示SSL 链接错误。
四、HTTP 请求过程
我们在浏览器中输入一个URL,回车之后便会在浏览器中观察到页面内容。实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来,模型如图4 所示。
图4 模型图
此处客户端即代表我们自己的PC 或手机浏览器,服务器即要访问的网站所在的服务器。
为了更直观地说明这个过程,这里用Chrome 浏览器的开发者模式下的Network 监听组件来做下演示,它可以显示访问当前请求网页时发生的所有网络请求和响应。
打开Chrome 浏览器,右击并选择“检查”项,即可打开浏览器的开发者工具。这里访问百度,输入该URL 后回车,观察这个过程中发生了怎样的网络请求。可以看到,在Network 页面下方出现了一个个的条目,其中一个条目就代表一次发送请求和接收响应的过程,如图5 所示。
图5 Network 面板
我们先观察第一个网络请求,即。
其中各列的含义如下。
第一列Name:请求的名称,一般会将URL 的最后一部分内容当作名称。第二列Status:响应的状态码,这里显示为200,代表响应是正常的。通过状态码,我们可以判断发送了请求之后是否得到了正常的响应。第三列Type:请求的文档类型。这里为document,代表我们这次请求的是一个HTML文档,内容就是一些HTML 代码。第四列Initiator:请求源。用来标记请求是由哪个对象或进程发起的。第五列Size:从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源,则该列会显示from cache。第六列Time:发起请求到获取响应所用的总时间。第七列Waterfall:网络请求的可视化瀑布流。
点击这个条目,即可看到更详细的信息,如图6 所示。
图6 详细信息
首先是General 部分,Request URL 为请求的URL,Request Method 为请求的方法,Status Code为响应状态码,Remote Address 为远程服务器的地址和端口,Referrer Policy 为Referrer 判别策略。
再继续往下,可以看到,有Response Headers 和Request Headers,这分别代表响应头和请求头。请求头里带有许多请求信息,例如浏览器标识、Cookies、Host 等信息,这是请求的一部分,服务器会根据请求头内的信息判断请求是否合法,进而作出对应的响应。图中看到的Response Headers 就是响应的一部分,例如其中包含了服务器的类型、文档类型、日期等信息,浏览器接受到响应后,会解析响应内容,进而呈现网页内容。
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h60103.shtml