人生苦短, 我用 Python
前文传送门:
小白学 Python 爬虫(1): 开篇 https://www.geekdigging.com/2019/11/13/3303836941/
小白学 Python 爬虫 (2): 前置准备(一) 基本类库的安装 https://www.geekdigging.com/2019/11/20/2586166930/
小白学 Python 爬虫(3): 前置准备(二)Linux 基础入门 https://www.geekdigging.com/2019/11/21/1005563697/
小白学 Python 爬虫(4): 前置准备(三)Docker 基础入门 https://www.geekdigging.com/2019/11/22/3679472340/
小白学 Python 爬虫 (5): 前置准备(四) 数据库基础 https://www.geekdigging.com/2019/11/24/334078215/
小白学 Python 爬虫 (6): 前置准备(五) 爬虫框架的安装 https://www.geekdigging.com/2019/11/25/1881661601/
网络的起源
这个其实是一个冷知识, 各位同学可以猜测一下计算机网络的起源是在哪里.
硅谷? 大学? 实验室? 有点接近了, 但还不够准确.
准确的答案是在美苏冷战背景下的美国国防部 .
对的, 你没看错, 是美国军方 , 最先进的技术总是先应用于军事领域, 随着时间的推移才会慢慢的民用化.
1968 年, 在美国国防部高级计划局的领导下, 阿帕网 ( ARPANET ) 诞生了.
ARPANET 只有四个节点, 连接起加利福尼亚州大学洛杉矶分校, 加州大学圣巴巴拉分校, 斯坦福大学, 犹他州大学这四所学校的大型计算机.
阿帕网 , 是全球公认的计算机网络的始祖.
URI , URL 和 URN
爬虫是一个模拟浏览器进行 HTTP 请求的过程. 这就需要我们了解从浏览器输入 URL 到获取到网页中间究竟发生了什么.
先介绍一组概念, URI 和 URL :
URI = Universal Resource Identifier 统一资源标志符, 用来标识抽象或物理资源的一个紧凑字符串.
URL = Universal Resource Locator 统一资源定位符, 一种定位资源的主要访问机制的字符串, 一个标准的 URL 必须包括: protocol,host,port,path,parameter,anchor.
URN = Universal Resource Name 统一资源名称, 通过特定命名空间中的唯一名称或 ID 来标识资源.
没看懂是吧, 没事儿, 不需要懂, 了解一下就好了, 我们来举例子.
比如上面这张图片的地址: , 它是一个 URL 同时也是一个 URI , URL 是 URI 的子集, 也就是说每个 URL 都是 URI , 但不是每个 URI 都是 URL , 因为 URI 还包括一个子类叫 URN . 在目前的网络中 URN 的使用非常少, 所以几乎所有的 URI 都是 URL , 一般的网页链接我们既可以称为 URL , 也可以称为 URI , 完全看个人喜好.
超文本
什么是超文本?
超文本是指可以链接到另一个文档或文本的单词, 短语或大块文本. 超文本涵盖了文本超链接和图形超链接.
我们在浏览器中访问的网页是由 html 编写而成, 而 HTML 则被称作为 "超文本标记语言". 在 HTML 代码中, 包含了一系列的标签, 包括图片等的超链接.
我们来看一下一个真实的网站的源代码是怎么样的, 在 Chrome 浏览器中, 使用 F12 打开开发者工具.
HTTP 和 HTTPS
什么是 HTTP ?
超文本传输协议, 是一个基于请求与响应, 无状态的, 应用层的协议, 常基于 TCP/IP 协议传输数据, 互联网上应用最为广泛的一种网络协议, 所有的 WWW 文件都必须遵守这个标准. 设计 HTTP 的初衷是为了提供一种发布和接收 HTML 页面的方法.
什么是 HTTPS?
《图解 HTTP》这本书中曾提过 HTTPS 是身披 SSL 外壳的 HTTP.HTTPS 是一种通过计算机网络进行安全通信的传输协议, 经由 HTTP 进行通信, 利用 SSL/TLS 建立全信道, 加密数据包. HTTPS 使用的主要目的是提供对网站服务器的身份认证, 同时保护交换数据的隐私与完整性.
PS:TLS 是传输层加密协议, 前身是 SSL 协议, 由网景公司 1995 年发布, 有时候两者不区分.
现在越来越多的网站和 App 都已经向 HTTPS 方向发展, 例如:
苹果公司强制所有 iOS App 在 2017 年 1 月 1 日前全部改为使用 HTTPS 加密, 否则 App 就无法在应用商店上架;
谷歌从 2017 年 1 月推出的 Chrome 56 开始, 对未进行 HTTPS 加密的网址链接亮出风险提示, 即在地址栏的显著位置提醒用户 "此网页不安全";
腾讯微信小程序的官方需求文档要求后台使用 HTTPS 请求进行网络通信, 不满足条件的域名和协议无法请求.
HTTP 协议
HTTP 协议本身是非常简单的. 它规定, 只能由客户端主动发起请求, 服务器接收请求处理后返回响应结果, 同时 HTTP 是一种无状态的协议, 协议本身不记录客户端的历史请求记录.
为了比较直观的展示这个过程, 我们依然打开 Chrome 浏览器, 按 F12 开启开发者模式.
看第一行, www.geekdigging.com 那一行:
Name: 请求的名称.
Status: 状态码, 200 代表正常响应.
Type: 文旦类型, 这里我们是请求了一个 HTML 文档.
Initiator: 请求源. 用来标记请求是由哪个对象或进程发起的.
Size: 资源大小, 这个标识了我们请求的资源的大小.
Time: 消耗的时间, 单位是 ms .
Watefall: 网络请求的可视化瀑布流.
我们点击一下那一行, 可以看到更加详细的内容:
包含了 Header 头信息, Preview (Response Preview) 响应信息预览, Response 响应具体的 HTML 代码, Cookies ,Timing 整个请求周期耗时.
General 部分: Request URL 为请求的 URL, Request Method 为请求的方法, Status Code 为响应状态码, Remote Address 为远程服务器的地址和端口, Referrer Policy 为 Referrer 判别策略.
Request 请求
一个 HTTP 请求报文由请求行 (request line), 请求头部(headers), 空行(blank line) 和请求数据(request body)4 个部分组成.
请求行
分为三个部分: 请求方法, 请求地址 URL 和 HTTP 协议版本, 它们之间用空格分割.
例如, GET /index.HTML HTTP/1.1.
HTTP/1.1 定义的请求方法有 8 种:
GET : 请求页面, 并返回页面内容.
POST : 大多用于提交表单或上传文件, 数据包含在请求体中.
PUT : 从客户端向服务器传送的数据取代指定文档中的内容.
DELETE : 请求服务器删除指定的页面.
PATCH : 是对 PUT 方法的补充, 用来对已知资源进行局部更新 .
HEAD: 类似于 GET 请求, 只不过返回的响应中没有具体的内容, 用于获取报头.
OPTIONS: 允许客户端查看服务器的性能.
TRACE: 回显服务器收到的请求, 主要用于测试或诊断.
CONNECT :HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器.
常用的有 GET 和 POST .
GET
在浏览器中直接输入 URL 并回车, 这就发起了一个 GET 请求, 请求的参数会直接包含在 URL 里, 请求参数和对应的值附加在 URL 后面, 利用一个问号 ? 代表 URL 的结尾与请求参数的开始, 传递参数长度受限制. 由于不同的浏览器对地址的字符限制也有所不同, 一般最多只能识别 1024 个字符, 所以如果需要传送大量数据的时候, 也不适合使用 GET 方式.
POST
允许客户端给服务器提供信息较多. POST 方法将请求参数封装在 HTTP 请求数据中, 以名称 / 值的形式出现, 可以传输大量数据, 这样 POST 方式对传送的数据大小没有限制, 而且也不会显示在 URL 中.
请求头
因为请求行所携带的信息量非常有限, 以至于客户端还有很多想向服务器要说的事情不得不放在请求首部(Header), 请求首部用于给服务器提供一些额外的信息, 比如 User-Agent 用来表明客户端的身份, 让服务器知道你是来自浏览器的请求还是爬虫, 是来自 Chrome 浏览器还是 Firefox.HTTP/1.1 规定了 47 种首部字段类型. HTTP 首部字段的格式很像 Python 中的字典类型, 由键值对组成, 中间用冒号隔开.
下面简要说明一些常用的头信息.
Accept: 请求报头域, 用于指定客户端可接受哪些类型的信息.
Accept-Language: 指定客户端可接受的语言类型.
Accept-Encoding: 指定客户端可接受的内容编码.
Host: 用于指定请求资源的主机 IP 和端口号, 其内容为请求 URL 的原始服务器或网关的位置. 从 HTTP 1.1 版本开始, 请求必须包含此内容.
Cookie: 也常用复数形式 Cookies, 这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据. 它的主要功能是维持当前访问会话. 例如, 我们输入用户名和密码成功登录某个网站后, 服务器会用会话保存登录状态信息, 后面我们每次刷新或请求该站点的其他页面时, 会发现都是登录状态, 这就是 Cookies 的功劳. Cookies 里有信息标识了我们所对应的服务器的会话, 每次浏览器在请求该站点的页面时, 都会在请求头中加上 Cookies 并将其发送给服务器, 服务器通过 Cookies 识别出是我们自己, 并且查出当前状态是登录状态, 所以返回结果就是登录之后才能看到的网页内容.
Referer: 此内容用来标识这个请求是从哪个页面发过来的, 服务器可以拿到这一信息并做相应的处理, 如作来源统计, 防盗链处理等.
User-Agent: 简称 UA, 它是一个特殊的字符串头, 可以使服务器识别客户使用的操作系统及版本, 浏览器及版本等信息. 在做爬虫时加上此信息, 可以伪装为浏览器; 如果不加, 很可能会被识别出为爬虫.
Content-Type: 也叫互联网媒体类型 (Internet Media Type) 或者 MIME 类型, 在 HTTP 协议消息头中, 它用来表示具体请求中的媒体类型信息. 例如, text/HTML 代表 HTML 格式, image/gif 代表 GIF 图片, application/JSON 代表 JSON 类型, 更多对应关系可以查看此对照表: http://tool.oschina.net/commons .
请求数据
请求体一般承载的内容是 POST 请求中的表单数据, 而对于 GET 请求, 请求体则为空.
注意这里提交数据的方式和请求头设置的 Content-Type 息息相关.
Response 响应
服务端接收请求并处理后, 返回响应内容给客户端, 同样地, 响应内容也必须遵循固定的格式浏览器才能正确解析. HTTP 响应也由 3 部分组成, 分别是: 响应行, 响应首部, 响应体, 与 HTTP 的请求格式是相对应的.
响应行
响应行同样也是 3 部分组成, 由服务端支持的 HTTP 协议版本号, 状态码, 以及对状态码的简短原因描述组成.
状态码
响应状态码表示服务器的响应状态, 常见的如 200 代表服务器正常响应, 404 代表页面未找到, 500 代表服务器内部发生错误.
响应头
响应头包含了服务器对请求的应答信息, 如 Content-Type,Server,Set-Cookie 等. 下面简要说明一些常用的头信息.
Date: 标识响应产生的时间.
Last-Modified: 指定资源的最后修改时间.
Content-Encoding: 指定响应内容的编码.
Server: 包含服务器的信息, 比如名称, 版本号等.
Content-Type: 文档类型, 指定返回的数据类型是什么, 如 text/HTML 代表返回 HTML 文档, application/x-JavaScript 则代表返回 JavaScript 文件, image/jpeg 则代表返回图片.
Set-Cookie: 设置 Cookies. 响应头中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookies 中, 下次请求携带 Cookies 请求.
Expires: 指定响应的过期时间, 可以使代理服务器或浏览器将加载的内容更新到缓存中. 如果再次访问时, 就可以直接从缓存中加载, 降低服务器负载, 缩短加载时间.
响应体
最重要的当属响应体的内容了. 响应的正文数据都在响应体中, 比如请求网页时, 它的响应体就是网页的 HTML 代码; 请求一张图片时, 它的响应体就是图片的二进制数据.
在做爬虫时, 我们主要通过响应体得到网页的源代码, JSON 数据等, 然后从中做相应内容的提取.
参考
https://cuiqingcai.com/5465.html
来源: https://www.cnblogs.com/babycomeon/p/11955593.html