1.HTTP响应
前面说过了Http方式发出了网址请求,现在介绍一下服务器收到请求后的响应,响应就是服务器对应请求信息的回馈,由响应状态码、响应头和响应体组成。
常见响应状态码有:表示成功的200,表示错误请求的400,未授权的401,禁止访问的403,未找到资源的404,还有网关超时的504。。。。。。具体可参考菜鸟教程的http响应状态码列表
菜鸟教程http状态码列表一览
响应头
包含重要的服务器应答信息:Content-Type、Server、Set-Cookie为其中重点:
Content-Type,文档类型,指定返回的数据类型,如text/html即返回html文本,application/x-javascript表示返回Javascript脚本,image/jpeg返回jpeg格式的图片;
Content-Encoding,指定响应内容的编码;
Date,响应产生时间;
Expires,指定响应的过期时间,这里的响应内容可以作为缓存,使其同样的客户端请求的访问可以加快响应速度,缩短加载时间。
Last-Modified,指定资源最后的修改时间;
Set-Cookie,设置Cookie,用于服务器通知浏览器,此内容需要放在Cookie中,下次请求以此为验证信息。
响应体
重要的正文数据,爬虫请求网页时得到的解析内容就是响应体中的html文本或者一张图片的二进制数据等。里面重要的html代码、json数据,这个是我们爬虫需要得到的目标所在,不过最后需要处理才能输出我们想要的信息。在前面进入的www.baidu.com请求条目中,点击进入Response,下面所示的就是网页的源代码,而Preview就是响应体的呈现效果。如下:
2.HTTP2.0
HTTP是基于TCP实现的一种应用层协议,这个参考尹圣雨所著的24章《制作HTTP服务器端》就可以看到一个简单的实现过程。就TCP本身而言,它就存在一个流控制机制,TCP头中存在的Advertised-Window的字段就是用来做这个信息表示,用来提示对方,当前本机的缓冲区剩余量,很多都称呼这个为一个窗口,这个机制也叫滑动窗口流量机制。
HTTP2的流控制
在HTTP1中,客户端为了实现多个并行请求以提升性能,会使用多个TCP连接,而浏览器控制资源的做法会对单个域名有6-8个TCP连接请求限制;这个多路复用的实现在HTTP2中是以二进制分帧技术实现,使得不再以多个TCP连接实现多路并行,也就是HTTP2中只需要一个TCP连接就可连接域名并实现并行发送多个请求和响应,这带来什么影响呢?
这会导致TCP流控制不够精细,具体内部原理不述,但HTTP2.0的做法是提供简单的构建块给连接双方来实现自己的数据流和连接级流控制。
服务端推送
上面是客户端可以发出多个并行请求,这里则是一台服务器面对一个客户端的多个响应,即除了客户端初始请求,服务器还推送额外资源(感觉像广告?),这个不需要客户端的额外请求。
除此以外,针对肯定请求的内容,服务端可以提前推送,客户端针对此也有权利拒绝接收,因为这部分内容可能已经缓存在浏览器中,那这个时候就会拒绝接收。另外,主动推送的资源必须是服务端客户端双方确认过的信息,不能随便推送第三方资源。
3.web网页组成
对于网站,可视化部分往往由三个部分组成:html + css + javascript,html是使用标签来描述组件的语言,熟练使用不同标签组成一个漂亮可用的网页是前端程序员乃至现在部分后端程序员需要具备的能力要求。css,全称cascading style sheets,层叠样式表的意思,网页中的文字字体、颜色、大小,元素间距、排列等都是"样式";javascript,脚本语言之一,一直都很火,但没时间学习过,主要实现用户和界面的交互,使得我们说的静态网页成为动态网页。
菜鸟教程网页建设指南
参考html中标签,可以看到一个网页内容就是由不同标签构成的一个html节点树,根节点为html标签,其下是head和body标签,层层下去就是我们需要的重要资源。
4.爬虫基本概述
总结上面的知识,爬虫就是模拟浏览器发出请求,然后解析响应中信息,存储或显示相关有用信息的自动化程序。
清晰明了以后,我们编写爬虫程序第一步就是实现获取网页的功能,主要使用urllib、requests等库来构造发送给网站服务器的请求,然后获取响应中的响应体,使用类库的数据结构存储,提取body;在body提取后,我们就需要解析,通用方式是构造正则表达式,基于网站复杂不一的规则,会有一些库是用来根据网页节点属性来提取网页信息,常用库有pyquery、Beautiful Soup;信息提取后,我们需要存储处理,保存成txt、excel或者json,也可以保存到相关数据库。
登陆验证
除了我们日常可以直接访问的网页以外,还有很多网页是需要登陆才能访问的,这部分内容涉及到了一个凭证,它是session和cookie的共同结晶。session和cookie是保持http连接会话的一个技术,在此之前,http有个叫无状态连接,客户端发送请求,服务器响应,另外发一个请求,服务器再响应,客户端需要前面请求过的信息,再发一个请求,服务器再次响应,而不是保持之前请求到的信息。session在服务端,cookie在客户端,浏览器在访问相同网页时自动附带cookie,服务器通过cookie识别客户端身份,是否登录,然后返回相应响应。因此,在爬虫中,我们将登录成功后获取的cookie构造在请求头中,发送请求时就不需要重复登录了。现在了解一下session和cookie具体概念和其中重要属性。
session,在面向对象编程中有个对象概念,一个session对象就用来保存特定用户会话所需的属性及配置信息,当用户在页面跳转,而用户的信息就不会丢失,诸如登录状态的信息能一直保持。当用户请求时,如果还没建立session对象就会创建一个,失效了就销毁。
cookie,为了使得session鉴别身份进行跟踪的存储数据。用户在第一次请求时,服务器响应一个带有Set-Cookie字段的响应给客户端同时标记用户,然后客户端保存cookie,下次请求时就会连带cookie一起提交,服务器检查cookie中的session ID确认身份,再判断用户状态,从而返回相应。如果失效,就需要从新登陆验证之类的。
如上为百度下的cookie界面,当中的一些cookie条目表明属性如下:
name,cookie名称,创建后不可更改;
value,cookie值,这里涉及编码,若为unicode需要为字符编码,如果是二进制,需要用base64编码;
domain,指定可访问域名;
path,cookie使用路径,即该路径下页面可访问cookie,如果是/,即根目录,就是域名下所有页面都可访问这个cookie;
max-age,失效时间,以秒为计时单位;
http,cookie的httponly属性标记处,若为true,即只能在http headers可携带cookie信息。不能通过document.cookie来访问(若为false就可以?);
secure,是否只允许使用安全协议来传输cookie,即使用https和ssl等安全协议加密后传输。
误区记录:对于session和cookie,当我们尚在登录界面时退出浏览器等软件,并不注销,服务器是不会销毁session对象的,只会在本机清除cookie信息,然后重新打开浏览器访问同样网页时就需要重新登录,所以关闭浏览器,并不代表session就被清除了,只有客户端注销或者max-ag时间到了才会销毁session。这时候的表现都是重新登录,所以我们看到一个问题的产生有多种情况就是这种原因,偏偏表现状态都是一样的就很麻烦。
5.关于代理
爬虫原本只是一个搜索信息,搜集数据的方便工具,但如果滥用,就会非常危险,所以很多网站都针对请求过于频繁有个审核机制,如果判定是爬虫,就会返回403禁止访问状态码,这是网站应对爬虫的一个反爬虫措施。基于此,我们的措施就是包装我们的IP,使其不识别本机发起请求,其中一种办法就是使用代理。
代理
代理就是代理服务器,即proxy server,拥有代替网络用户获得网络信息的功能,类似中转站,当我们发送请求时,通过发送到代理服务器,由代理服务器去请求响应,收到响应后再转给本机,从而实现一个IP伪装。我们爬取时不断更换代理,从而实现IP伪装,这样就不会导致本机IP被服务器*。(不过很烦的一点就是,以前做练习用的代理经常有过期的,这样看来还有其他办法可以实现类似功能)。
代理分类
根据代理协议可分为:
FTP代理,主要访问FTP服务器,有上传、下载及缓存功能,端口有21、2121等;
HTTP代理,主要访问网页,有内容过滤和缓存功能,端口有80、8080;
RTSP服务器,主要用于Realplayer访问Real流媒体服务器,有缓存功能,端口有23;
SSL/TLS代理,用于访问加密网站,有SSL和TLS加密功能,端口常见为443;
Telnet代理,用于Telnet远程控制,端口为23(大家要注意小心);
SOCKS代理,单纯传输数据包,速度很快,有缓存功能,端口为1080。
根据匿名程度区分:
高度匿名代理,原封不动转发数据包;
普通匿名代理,会对数据包做少许改动,并且服务端有可能发现这是个代理;
透明代理,改动数据包,告诉服务端其真实IP,使用缓存加快速度,内容过滤增强安全性。
当我们选择代理时,能用高度匿名的就用高度匿名的,能用付费的就付费的吧,当然还有一些诸如ADSL拨号的,大家可以了解一下(崔庆才大佬的书面建议是这么写的)
最后想告诉一下正在看本文的同学,爬虫是利器,但它是双刃剑,容易伤人伤己,我们要把握好分寸,别把面向爬虫编程整成面向*编程了啊,注意注意,阿弥陀佛。