HTTP和HTTPS
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS的请求步骤
- 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
- Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
- 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
- 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
- Web服务器利用自己的私钥解密出会话密钥。
- Web服务器利用会话密钥加密与客户端之间的通信。
HTTP请求头信息的重要性
罗列一些比较重要的请求头字段信息及说明。
- User-Agent:用户代理信息,里面包含客户端使用的操作系统、系统内核、系统版本位数,以及浏览器版本和名称。
- Cookie:身份识别等信息,例如登录后的身份信息、搜索引擎的搜索关键词实现广告的精准定位。
- Content-Type:客户端告诉服务器,设置请求体的MIME类型(适用POST和PUT请求)
- Referer:当前访问网址的来源网址,例如你从首页看到某篇文章,则访问该文章时,Referer就是首页的网址。
- Accept-Encoding:这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式)。
- Accept:告诉服务端,客户端接收什么类型的响应,有网页文本、音视频文件、资源文件等。
- Accept-Language:设置接受的语言
- Authorization:设置HTTP身份验证的凭证
- Connection:设置当前连接和hop-by-hop协议请求字段列表的控制选项
- Content-Length:设置请求体的字节长度
- Host:设置服务器域名和TCP端口号,如果使用的是服务请求标准端口号,端口号可以省略
- Origin:标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段)
- Proxy-Authorization为连接代理授权认证信息
HTTP响应状态码
200系列
- 200 OK:这个是最常见的,也是爬虫工程师最喜欢的,代表你本次的请求顺利拿到了响应,没有任何问题。
- 201 Created:201代表创建成功,通常是指浏览器或爬虫给服务器上传数据,服务器接收并验证数据没问题之后,服务器返回客户端一个201,代表成功。提交数据,通常是POST方法提交
- 202 Accepted:服务器拿到了数据,但是还没处理好结果,所以先发回一个202。这个状态码一般在爬虫中看不到,但是适合在异步操作的情况下返回。
300系列
- 301 MovedPermanently:当前资源的网址永久性迁移,并且会给你一个新的网址。值得注意的是,如果是POST请求拿到301,则下一次请求自动变成GET。
- 302 Move Temporarily:当前资源网址暂时性迁移到新地址,和301性质有点不一样。
- 304 Not Modified:这个在浏览器加载静态资源的时候,特别容易碰到,就是浏览器使用本地缓存而不消耗带宽去加载在线的静态资源,是加速网页渲染的一种资源调用机制。是前端程序员嫌弃的一个状态码。
400系列
- 400 BadRequest:错误请求,400系列最典型的,看到这个错误,要么是请求头参数不对,要么是请求主体的内容错误。
- 401 Unauthorized:401认证错误,这个还是非常好识别的,身份无法识别或者身份权限不够,检查请求头中的身份字段信息和Cookie值。
- 403 Forbidden:禁止访问,大并发爬虫中比较容易碰到,问题很直观,你访问太多了【换IP或电脑】,或者身份权限不够【换身份信息】。
- 404 Not Found:404找不到,这个错误不用太在意,用浏览器测试几次就好,要么是你的网址写错了,要么是网址对应的网络资源无法加载【这不怪程序】。
- 405 MethodNot Allowed:405方法不被允许,简单且少见的错误,意思就是你请求的姿势不对,检查请求方法,如Get、Post、Put、Delete,总有一个是对的。
500系列
- 500 Internal ServerError:网络错误,就和你断网了一样,具体点就是你的网络和网址所在网络,无法连通。
- 502 BadGateway:网关错误,请求出去要被网关解析目的地址并转发你的请求,这个错误就是网关不工作了,无法把你的请求发出去。这里的网关,可以理解成你的路由器或者你用的代理IP 服务器。
- 503 Service Unavailable:服务不可用,这个就是目标服务器的问题了,你要做的是通知网站管理员或者等。一般情况下,国家网站部分有休息时间,例如晚上关网。商业服务器的服务不可用,大多是升级或者临时卡了,可以过段时间再试。
- 504 Gateway Timeout:网关超时,这个504和502,都是网关的问题,但是又不一样。504是你找网关转发,你默认等待180秒【3分钟】,然后网关超时了没理你;502的问题是,你压根就找不到网关。
- 505 HTTPVersionNot Supported:HTTP版本不支持,这个比较少见,但是肯定有。网站内容太新或者太旧,对客户端的http版本要求不一样。你需要检查下本次请求所使用的http版本,然后改成网站指定版本,就可以解决这个问题。
爬虫解决HTTPS认证的解决问题
解决方法:
- 验证错误,那就不验证
- 更新系统的证书库
- 更新pip库:pyopenssl和cryptography
解决思路:
- 优先使用不认证,简单暴力,还有效
- 运行或部署爬虫时,记得同步 pyopenssl和 cryptography 操作系统越新,越不容易碰到SSL错误
GET和POST请求区别
- GET和POST是HTTP请求的两种基本方法,最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
- GET在浏览器回退时是无害的,而POST会再次提交请求
- GET请求只能进行url编码,而POST支持多种编码方式
- GET请求在URL中传送的参数是有长度限制的,而POST没有
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
三种content-type
application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持
multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctype 等于这个值。
application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
动态网页和静态网页
静态网页就是直接固定的数据,动态网页就是有交互的网页,比如数据通过ajax请求动态加载了数据。
百度百科,维基百科这种很少变动的网页就是静态网页。有些博客也是静态网页。
静态网页相对稳定,响应快,利于SEO
动态网页体验好,数据部分加载,对服务器友好,扩展性好