在当前数据爆发的时代,数据分析行业势头强劲,越来越多的人涉足数据分析领域。进入领域最想要的就是获取大量的数据来为自己的分析提供支持,但是如何获取互联网中的有效信息?这就促进了“爬虫”技术的飞速发展。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。
另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
笔者是爬虫初学者,通过这篇综述来记录一下自己的心得体会。
以下为文章主要内容:
1. 初见爬虫
使用Python中的Requests第三方库。在Requests的7个主要方法中,最常使用的就是get()方法,通过该方法构造一个向服务器请求资源的Request对象,结果返回一个包含服务器资源的额Response对象。通过Response对象则可以获取请求的返回状态、HTTP响应的字符串即URL对应的页面内容、页面的编码方式以及页面内容的二进制形式。
在了解get()方法之前我们先了解一下HTTP协议,通过对HTTP协议来理解我们访问网页这个过程到底都进行了哪些工作。
1.1 浅析HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。HTTP协议主要有几个特点:
-
支持客户/服务器模式
-
简单快捷:客服向服务器发出请求,只需要传送请求方法和路径。请求方法常用的有GET, HEAD, POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快。
-
灵活:HTTP允许传输任意类型的数据对象。
-
无连接:无连接的含义是限制每次连接请求只处理一个请求。服务器处理完客户的请求,收到客户的应答后即断开连接,这种方式可以节省传输时间。
-
无状态:HTTP协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。
下面通过一张图我们来了解一下访问网页的过程都发生了什么:
1. 首先浏览器拿到网址之后先将主机名解析出来。如 http://www.baidu.com/index.html 则会将主机名 www.baidu.com 解析出来。
2. 查找ip,根据主机名,会首先查找ip,首先查询hosts文件,成功则返回对应的ip地址,如果没有查询到,则去DNS服务器查询,成功就返回ip,否则会报告连接错误。
3. 发送http请求,浏览器会把自身相关信息与请求相关信息封装成HTTP请求 消息发送给服务器。
4. 服务器处理请求,服务器读取HTTP请求中的内容,在经过解析主机,解析站点名称,解析访问资源后,会查找相关资源,如果查找成功,则返回状态码200,失败就会返回大名鼎鼎的404了,在服务器监测到请求不在的资源后,可以按照程序员设置的跳转到别的页面。所以有各种有个性的404错误页面。
5. 服务器返回HTTP响应,浏览器得到返回数据后就可以提取数据,然后调用解析内核进行翻译,最后显示出页面。之后浏览器会对其引用的文件比如图片,css,js等文件不断进行上述过程,直到所有文件都被下载下来之后,网页就会显示出来。
HTTP请求,http请求由三部分组成,分别是:请求行、消息报头、请求正文。请求方法(所有方法全为大写)有多种,各个方法的解释如下:
-
GET 请求获取Request-URI所标识的资源
-
POST 在Request-URI所标识的资源后附加新的数据
-
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
-
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
-
DELETE 请求服务器删除Request-URI所标识的资源
-
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
-
CONNECT 保留将来使用
-
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
GET方法应用举例:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF,其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
-
1xx:指示信息--表示请求已接收,继续处理
-
2xx:成功--表示请求已被成功接收、理解、接受
-
3xx:重定向--要完成请求必须进行更进一步的操作
-
4xx:客户端错误--请求有语法错误或请求无法实现
-
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
点 击有惊喜200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。