网络爬虫简介

网络爬虫(又被称为网页蜘蛛,网络机器人,在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 //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

eg:HTTP/1.1 200 OK (CRLF)

详细的HTTP协议可以参考这篇文章:
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

前面我们了解了HTTP协议,那么我们访问网页的过程,那么网页在是什么样子的。爬虫眼中的网页又是什么样子的。

网是静态的,但爬虫是动态的,所以爬虫的基本思想就是沿着网页(蜘蛛网的节点)上的链接的爬取有效信息。当然网页也有动态(一般用PHP或ASP等写成,例如用户登陆界面就是动态网页)的,但如果一张蛛网摇摇欲坠,蜘蛛会感到不那么安稳,所以动态网页的优先级一般会被搜索引擎排在静态网页的后面。

知道了爬虫的基本思想,那么具体如何操作呢?这得从网页的基本概念说起。一个网页有三大构成要素,分别是html文件、css文件和JavaScript文件。如果把一个网页看做一栋房子,那么html相当于房子外壳;css相当于地砖涂料,美化房子外观内饰;JavaScript则相当于家具电器浴池等,增加房子的功能。从上述比喻可以看出,html才是网页的根本,毕竟地砖颜料在市场上也有,家具电器都可以露天摆设,而房子外壳才是独一无二的。

下面就是一个简单网页的例子:

网络爬虫简介

而在爬虫眼里,这个网页是这样的:

网络爬虫简介

因此网页实质上就是超文本(hypertext),网页上的所有内容都是在形如“<>...</>”这样的标签之内的。如果我们要搜集网页上的所有超链接,只需寻找所有标签中前面是"href="的字符串,并查看提取出来的字符串是否以"http"(超文本转换协议,https表示安全的http协议)开头即可。如果超链接不以"http"开头,那么该链接很可能是网页所在的本地文件或者ftp或smtp(文件或邮件转换协议),应该过滤掉。

在Python中我们使用Requests库中的方法来帮助我们实现对网页的请求,从而达到实现爬虫的过程。

1.2 Requests库的7个主要方法:

网络爬虫简介

最常用的方法get用来实现一个简单的小爬虫,通过示例代码展示:

网络爬虫简介

  1. Robots协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。通过几个小例子来解读一下robots.txt中的内容,robots.txt默认放置于网站的根目录小,对于一个没有robots.txt文件的网站,默认是允许所有爬虫获取其网站内容的。

网络爬虫简介
如果是商业利益我们是必须要遵守robots协议内容,否则会承担相应的法律责任。当只是个人玩转网页、练习则是建议遵守,提高自己编写爬虫的友好程度。

  1. 网页解析

BeautifulSoup尝试化平淡为神奇,通过定位HTML标签来格式化和组织复杂的网络信息,用简单易用的Python对象为我们展示XML结构信息。

BeautifulSoup是解析、遍历、维护“标签树”的功能库。

3.1 BeautifulSoup的解析器

网络爬虫简介

BeautifulSoup通过以上四种解析器来对我们获取的网页内容进行解析。使用官网的例子来看一下解析结果:

网络爬虫简介
首先获取以上的一段HTML内容,我们通过BeautifulSoup解析之后,并且输出解析后的结果来对比一下:

网络爬虫简介

网络爬虫简介

更多介绍点击下面的链接

来源:
https://mp.weixin.qq.com/s/sqJxmMOcm0i_XN0vzlwwqQ