目录
引用源
https://www.cnblogs.com/zhaof/p/6898138.html
爬虫的基本流程
发起请求
通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应
获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型
解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理
保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
Request 与 Response
HTTP Request
:
浏览器发送消息给网址所在的服务器,这个过程就叫做HTPP Request
HTTP Response
:
服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就是HTTP Response
浏览器收到服务器的Response
信息后,会对信息进行相应的处理,然后展示
Request中包含的内容
请求方法
GET
:请求指的页信息,并返回实体主体HEAD
:只请求页面的首部POST
:向指定的资源提交要处理的数据PUT
:向指定资源位置上传最新内容DELETE
:请求服务器删除指定的页面OPTIONS
:返回服务器支持的HTTP请求方法。用“*”代替资源名称,向WEB服务器发送OPTIONS方法,可以测试服务器功能是否正常CONNECT
:把请求连接转换到透明的TCP/IP通道WRAPPED
:允许客户端发送经过封装的请求TRACE
:请求服务器在响应中的实体主体部分返回所得到的内容PATCH
:实体中包含一表表,表中说明与该URI所表示的原内容的区别MOVE
:请求服务器将指定的页面移至另一个网络地址COPY
:请求服务器将指定的页面拷贝至另一个网络地址LINK
:请求服务器建立链接关系UNLINK
:断开链接关系
请求URL
URL
,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL
的格式由三个部分组成:
- 协议(或称为服务方式)。
- 该资源的主机IP地址(有时也包括端口号)。
- 主机资源的具体路径,包括目录和资源文件名等。
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据。
另外,URI
(统一资源标识符),相对路径,定位的是某台机器上的资源
HTTP协议及版本
HTTP/1.0
,1996年开始使用HTTP/1.1
,1999年开始使用HTTP/2.0
,2015年开始使用
HTTP/1.0与HTTP/1.1主要区别:
- 长连接
HTTP/1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP/1.1默认支持长连接。
HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因止最好能维持一个长连接,可以用个长连接来发多个请求。 - 节约带宽
HTTP/1.1支持只发送header信息,如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。 - HOST域
web server上的多个虚拟站点可以共享同一个ip和端口
HTTP/1.1与HTTP/2.0主要区别:
- 多路复用
支持并发 - 数据压缩
使用HPACK算法对header的数据进行压缩 - 服务器推送
服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常适合加载静态资源。
请求头
请求方法、请求URL、HTTP协议及版本称为请求首行,与请求头以一个回车符和一个换行符作为分隔。
每一个请求头以一个回车符和一个换行符作为分隔
包含请求时的头部信息,如User-Agent,Host,Cookies等信息
请求体
请求头与请求体以两个回车符和两个换行符作为分隔
请求是携带的数据,如提交表单数据时候的表单数据(POST)
Response中包含的内容
HTTP协议及版本
响应状态
- 响应状态码
- 由3位数字组成,表示请求是否被理解或被满足
- 响应状态描述
-
给出了关于状态代码的简短的文字描述
-
第一个数字定义了响应的类别,后面两位没有具体的分类
-
第一个数字有五种可能的取值:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
-
常见状态代码及描述:
状态码 | 状态描述 | 解释 |
---|---|---|
200 | OK | 请求成功 |
301 | Moved Permanently | 目标永久性转移 |
302 | Found | 目标暂时性转移 |
400 | Bad | Request 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在,eg:输入了错误的URL |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
响应头
如内容类型,类型的长度,服务器信息,设置Cookie,如下图
响应体
最主要的部分,包含请求资源的内容,如网页HTMl,图片,二进制数据等。即我们真正要的“干货”。
爬取数据的种类
- 网页文本:如HTML文档,Json格式化文本等
- 图片:获取到的是二进制文件,保存为图片格式
- 视频:同样是二进制文件
- 其他:只要请求到的,都可以获取
解析数据方法
- 直接处理
- Json解析
- 正则表达式处理
- BeautifulSoup解析处理
- PyQuery解析处理
- XPath解析处理
爬取动态加载的数据
- 分析ajax
- Selenium/webdriver
- Splash
- PyV8,Ghost.py
保存数据
-
文本:纯文本,Json,Xml等
-
关系型数据库:如mysql,oracle,sql server等结构化数据库
-
非关系型数据库:MongoDB,Redis等key-value形式存储