目录
爬虫的概念
-
概念
网络爬虫也叫网络蜘蛛,特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。 更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序.
-
作用
数据采集,搜索引擎,模拟操作
-
分类
通用爬虫:搜索引擎的重要组成成分
聚焦爬虫:建立在通用爬虫的基础上,抓取页面当中指定的数据
爬虫的步骤
1.分析页面
-
找到抓取的数据,从哪里来
-
找到加密参数的生成位置
-
构建加密参数
2.获取数据
包括 动态数据 和 静态数据
静态数据
-
当前请求的全部数据(源代码)
-
HTML代码(构成页面的主要代码)
请求与响应
-
“我找你要,你给我给”
-
api接口当中的数据(json字符串)
3.解析数据
找到你想要得到的数据
4.保存数据
保存在电脑中,或者数据库中
网络协议
网络架构
-
c/s 即 client server --- 客户端与服务端
-
b/s 即 browser server --- 浏览器与服务端
-
m/s 即 mobile server --- 移动端与服务端
HTTP协议
计算机之间也是需要一种规则,保障之间信息的有效交流,这就是HTTP协议
概念
http
-
HTTP 是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW: World Wide Web )服务器传输超文本到本地浏览器的传送协议。是以明文的方式在网络当中传递数据。目前互连网上90%的网络传输都是基于http协议。
https
-
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层
特点
HTTP 协议 80
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
-
无连接:限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,立即断开。
HTTPS 协议 443
-
内容加密建立一个信息安全通道,来保证数据传输的安全;
-
身份认证确认网站的真实性
-
数据完整性防止内容被第三方冒充或者篡改
HTTP_URL
HTTP使用URI(统一资源标识符)来传输数据和建立连接。
URl 主要包括一下几个部分:
协议部分 | “http:”,在HTTP后面的“//”为分隔符 |
域名部分 | “www.aspxfans.com” |
端口部分 | 跟在域名后面的是端口,8080,域名和端口之间使用 ":" 作为分隔符。 |
虚拟目录部分 | 从域名后的第一个“/”开始到最后一个“/”为止。“/news/” |
文件名部分 | 从域名后的最后一个“/”开始到“?”为止。“index.asp” |
锚部分 | 从“#”开始到最后。"name" |
参数部分 | 从“?”开始到“#”为止之间的部分为参数部分 |
请求消息Request
客户端发送一个HTTP请求到服务器的请求消息包括:请求行、请求头部、空行、请求数据
请求行-request Line
-
GET 1、主要是负责从服务器获取数据。 2、URL中添加请求参数,显示在地址栏。 3、请求字符串限制 1024个字节。 4、比
POST
更加高效和方便。 -
POST 1、主要负责向服务器提交数据。 2、没有大小限制。 3、比'GET'传递数据量大,安全性高。
什么时候用get,什么时候用post
-
找到目标数据的url(确定是动态数据还是静态数据)
静态数据 ---- 一般情况下,数据在源代码当中,他就是静态数据
---- 可右击--查看页面源代码检测
豆瓣top250为例
查看当前url的请求方式
-
想要抓取数据都在源代码里面
-
向豆瓣电影 Top 250 发起请求,获取源代码
-
右击--检查(或按f12) 打开开发者工具
-
选择网络(network) -- 选择全部(ALL)--- (按下F5)刷新当前页面(重新请求)
-
选择文档(DOC) -- 最初始的请求,一般都是第一个请求
-
点击标头(headers) -- 有 请求地址 和 请求方式 以及 状态码
-
【请求头】-request Header
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息
-
User-Agent:产生请求的浏览器类型;
-
referer:防盗链,页面跳转处,表明产生请求的网页来自于哪个URL,告诉服务器我是从哪个链接过来的
-
Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
-
Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
-
Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
-
Accept-Language:客户端可接受的自然语言;
-
Accept-Encoding:客户端可接受的编码压缩格式;
-
Accept-Charset:可接受的应答的字符集;
-
connection:连接方式(close 或 keepalive);
-
Content-Length:发送给HTTP服务器数据的长度。
-
Content-Type:具体请求的媒体的类型信息,力图 text/html 代表HTML格式,image/gif代表gif图片,application/json代表Json类型
-
charset:编码格式
-
Content-Range:响应资源的范围。可以在每次请求中标记请求的资源范围,在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。
-
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Contro并不会修改另一个消息消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、man-age、max-stake、min-fresh、only-if-cached;响应消息中的指令包括 public、privete、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age
【空行】
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;
【请求体】 -request Body
它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
【状态行】
状态行由 HTTP 协议版本、状态码和状态码的描述文本 3 个部分组成,他们之间使用空格隔开;
-
状态码 由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示;
-
1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
-
2xx:表示服务器已成功接收到请求并进行处理;
-
3xx:表示服务器要求客户端重定向;
-
4xx:表示客户端的请求有非法内容;
-
5xx:表示服务器未能正常处理客户端的请求而出现意外错误;
-
-
200 OK:表示客户端请求成功;
-
400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解;
-
401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用;
-
403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
-
404 Not Found:请求的资源不存在,例如,输入了错误的URL;
-
500 Internal Server Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求;
-
503 Service Unavailable:表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;
三次握手,四次挥手
客户端与服务端创建连接与断开连接
三次握手 ---创建连接
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
四次挥手 ---断开连接
第一次挥手: 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次挥手: 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
第三次挥手: 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手: 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
三次握手: 就是在前端发送请求报文之前, 确定一下是不是双方都 “在线” 四次挥手: 就是在后端发送完毕响应之后, 双方告知一下纷纷 “下线”
会话技术
http是无状态的,那服务端怎么区分同一个用户的连续请求呢,这就用到了会话技术:cookie和session。
概念
-
Cookie有时也用其复数形式 Cookies。 指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。
-
Cookie 可以理解为一个凭证 1.实际是由服务器发给客户端的特殊信息, 2.这些信息以文本文件的方式存放在客户端, 3.客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份。
Session中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。这个词在各个领域都有在使用,而我们web领域,一般使用的是其本义,一个浏览器窗口从打开到关闭这个期间。
Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。
而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个cookie,SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。因此session是基于cookie的.
Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行判定,所以相对于Cookie,Session的安全性更高。
一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。