网络爬虫简介
优采云 发布时间: 2020-05-09 08:01网络爬虫简介
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更时不时的称为网页追逐者),是一种根据一定的规则,自动地抓取万维网信息的程序或则脚本。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL装入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要按照一定的网页剖析算法过滤与主题无关的链接,保留有用的链接并将其倒入等待抓取的URL队列。然后,它将按照一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。
另外,所有被爬虫抓取的网页将会被系统储存,进行一定的剖析、过滤,并构建索引,以便以后的查询和检索;对于聚焦爬虫来说,这一过程所得到的剖析结果还可能对之后的抓取过程给出反馈和指导。
以下为文章主要内容:
初见爬虫
使用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合同是无状态合同。无状态是指合同对于事物处理没有记忆能力。缺少状态意味着假如后续处理须要上面的信息,则它必须重传,这样可能造成每次联接传送的数据量减小,另一方面,在服务器不需要原本信息时它的应答就较快。
爬取过程
首先浏览器领到网址以后先将主机名解析下来。如 则会将主机名 解析下来。
查找ip,根据主机名,会首先查找ip,首先查询hosts文件,成功则返回对应的ip地址,如果没有查询到,则去DNS服务器查询,成功就返回ip,否则会报告联接错误。
发送http请求,浏览器会把自身相关信息与恳求相关信息封装成HTTP请求 消息发送给服务器。
服务器处理恳求,服务器读取HTTP请求中的内容,在经过解析主机,解析站点名称,解析访问资源后,会查找相关资源,如果查找成功,则返回状态码200,失败才会返回大名鼎鼎的404了,在服务器检测到恳求不在的资源后,可以根据程序员设置的跳转到别的页面。所以有各类有个性的404错误页面。
服务器返回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合同,那么我们访问网页的过程,那么网页在是哪些样子的。爬虫眼里的网页又是哪些样子的。
网是静态的,但爬虫是动态的,所以爬虫的基本思想就是顺着网页(蜘蛛网的节点)上的链接的爬取有效信息。当然网页也有动态(一般用PHP或ASP等写成,例如用户登录界面就是动态网页)的,但若果一张蛛网摇摇欲坠,蜘蛛会倍感不这么安稳,所以动态网页的优先级通常会被搜索引擎排在静态网页的旁边。
知道了爬虫的基本思想,那么具体怎么操作呢?这得从网页的基本概念说起。一个网页有三大构成要素,分别是html文件、css文件和JavaScript文件。如果把一个网页看做一栋房屋,那么html相当于房屋壳体;css相当于瓷砖油墨,美化房屋外形内饰;JavaScript则相当于灯具家电浴场等,增加房屋的功能。从上述比喻可以看出,html才是网页的根本,毕竟瓷砖染料在市场上也有,家具家电都可以露天摆饰,而房屋壳体才是独一无二的。
下面就是一个简单网页的事例:
而在爬虫眼中网络爬虫,这个网页是这样的:
因此网页实质上就是超文本(hypertext),网页上的所有内容都是在形如“<>...</>”这样的标签之内的。如果我们要收集网页上的所有超链接,只需找寻所有标签中后面是"href="的字符串,并查看提取下来的字符串是否以"http"(超文本转换合同,https表示安全的http合同)开头即可。如果超链接不以"http"开头,那么该链接太可能是网页所在的本地文件或则ftp或smtp(文件或电邮转换合同),应该过滤掉。
在Python中我们使用Requests库中的方式来帮助我们实现对网页的恳求,从而达到实现爬虫的过程。
1.2 Requests库的7个主要方式:
最常用的方式get拿来实现一个简单的小爬虫,通过示例代码展示:
Robots协议
Robots协议(也称为爬虫协议、机器人合同等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎什么页面可以抓取,哪些页面不能抓取。通过几个小反例来剖析一下robots.txt中的内容,robots.txt默认放置于网站的根目录小,对于一个没有robots.txt文件的网站,默认是容许所有爬虫获取其网站内容的。
,
如果是商业利益我们是必须要遵循robots协议内容,否则会承当相应的法律责任。当只是个人玩转网页、练习则是建议遵循,提高自己编撰爬虫的友好程度。
网页解析
BeautifulSoup尝试化平静为神奇,通过定位HTML标签来低格和组织复杂的网路信息,用简单易用的Python对象为我们展示XML结构信息。
BeautifulSoup是解析、遍历、维护“标签树”的功能库。
3.1 BeautifulSoup的解析器
BeautifulSoup通过以上四种解析器来对我们获取的网页内容进行解析。使用官网的事例来看一下解析结果:
首先获取以上的一段HTML内容,我们通过BeautifulSoup解析然后,并且输出解析后的结果来对比一下: