一、概念
自动批量下载网络资源的程序(伪装成客户端与服务端进行数据交互的程序,客户端是与服务端对应的,网上的浏览器就属于伪装客户端)
作用:
1、数据收集:用于做数据采集的爬虫,叫”聚焦爬虫“,比如某app、网页或软件面向大众收集的数据
2、搜索引擎:比聚焦爬虫收集的范围更广,比如百度,通过搜索关键字将大量页面的信息爬取下来,放到自己的服务器上,需要对页面进行存储和定位
3、模拟操作:伪装成客户端,广泛用于模拟用户操作,比如测试机器人,灌水机器人等,都是通过同一个ip地址发出的请求进行伪装客户端操作(后台封掉ip权限就会限制到爬虫的操作)
爬虫开发的重难点:
1、数据的获取:避免网络资源被爬虫采集,服务端会设置非常多的图灵测试,阻止爬虫的恶意爬取
爬虫的恶意爬取:用户登录与服务器进行交互一般频率低,速度慢,但爬虫速度非常快,频率非常高,爬虫数量多了之后,频率也翻倍,服务器就会得到大量的请求,
并对其产生很大的压力,导致服务器崩溃,所以服务器一般会设置反爬措施。
目前的开发爬虫过程:大部分是为了解决反爬措施,同时也要控制好爬虫的速度,避免造成公共资源浪费
2、采集的速度
大数据时代,需要巨大数据量,所以采集速度也要很高,一般会采取并发及分布式来解决速度上的问题,这也是爬虫开发过程中的另一个重心
二、HTTP与HTTPS(有90%的网络协议的请求是通过这两种协议进行的)
请求:客户端与服务端进行的交互
响应:服务端处理的结果
网络架构:
1、c/s就是客户端(比如电脑版的微信、QQ音乐、网络游戏)与服务端
2、b/s就是浏览器(比如浏览器打开的音乐听歌网站)与服务端
3、m/s就是移动端(移动手机的客户端,比如手机版的微信和QQ)与服务端
HTTP协议:
1、原因:计算机之间需要交流,人类之间的交流用到的语法结构,在计算机之间叫做协议(也可以叫规则、约数、要求),保障了能互相理解对方的具体信息
2、概念及特点:
HTTP是超文本(超越文本的包含各种媒体的类型,比如音乐等)传输协议的缩写(作用就是传输),用于从万维网服务器传输超文本到本地浏览器的传送协议
HTTP是基于TCP/IP通信协议(比HTTP更为底层的一种协议)来传递数据,使用TCP通信协议的重要原因是基于面向连接的特点
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、EBCDIC、加密格式等 [2]
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
在计算机中一般分为四层:由高到低为应用层(HTTP协议的实现)、传输层(TCP协议的实现,“面向连接的”,保持数据的完整性)、网络层(IP协议的实现)、链路层。
由于传输层和网络层配合使用得太过广泛,所以也有说法上把两者合并起来了
(应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节)
爬虫的开发在于应用层的开发
HTTP协议的使用:(请求也叫定位)
1、HTTP请求的基本流程:包括请求和响应两部分,
请求前客户端和服务器需要进行连接(TCP),TCP连接分为三次握手:客户端发送请求,服务器接收成功,客户端确认收到消息(因为要限制无限循环的确认,所以限制TCP3次)
两次握手在服务器拥堵的时候会造成资源浪费,三次握手的话可以避免
服务器容易遭受攻击:黑客通过伪造大量不存在的IP地址(不存在的站点)发送SYN的请求,使服务端发送大量的资源占用cpu,严重的情况就会导致服务端瘫痪
防护syn攻击:服务器会把长时间占用的请求给丢弃或屏蔽掉
三次握手是请求开始,四次挥手是请求结束
四次挥手:哪一方不想接收连接了,哪一方就发送请求。
URL(统一资源定位符,全球统一):发送http请求时,通过URL对网络资源进行定位。每一个URL都是唯一的,由“协议+域名(IP地址)+端口默认80(可以不写)+路径+参数”组成,
域名可以通过DNS转换成IP地址(域名一般由端口组成),路径就是通过端口进入服务器找到的对应文件
HTTP请求格式(请求行,请求头,空行,请求体(请求正文))
请求报文格式:回车符+换行符用来分隔
请求正文通常是使用POST方法进行发送的数据,GET方法是没有请求正文的(GET是为了获取不是请求)
1、请求行:请求方法+空格+URL+空格+协议版本(HTTP/1.0)+回车符(\r)+换行符(\n)
2、请求头(有多个):头部字段名:值+回车符+换行符(后面接的是请求数据的话要再加一组回车符和换行符),伪装的主要内容在请求头,反爬越严重请求头用的就越多
3、请求数据(由回车和换行符与请求头分隔)
请求方法:(get(获取数据)、post(提交表单)、head(1.0版本有三种)、options、put、delete、trace、connect(1.1版本有五种)),其中某些方法服务器不予以开放
get:安全性不高、但方便高效,请求字符串限制1024个字节
post:无大小限制、安全性高
请求头:refere(获知从哪个链接过来的)、用Host方法时,请求行要把域名调到请求头来(Host:ss0.bdstatic.com)只留参数,不是固定的方法可以不用
connection连接方式【(close数据传输完后就四次挥手关闭了)或(keepalive长连接,数据传输完后HTTP连接不断掉适合多文件发送)】
cookie:存储于客户端的扩展字段
空行:最后一个请求头之后是一个空行(再加一组回车符和换行符),通知服务器以下不再有请求头
请求体(请求正文):不在get方法中使用,而是在post中使用(适用于需要客户填写表单的场合),与请求体最常用的方法是包类型和包体长度
HTTP响应格式(状态行、响应头、空行、响应正文)
1、状态行:协议版本+空格+状态码+空格+状态码描述(一般是OK)+回车符+换行符
2、响应头:头部字段名:值+回车符+换行符(后面接的是请求数据的话要再加一组回车符和换行符)
3、响应正文
状态码:由三位数字组成,第一位数字表示响应的类型(1表示服务器收到了,2表示收到并处理了,3是要求服务器重定向,4表示有非法内容,5表示未能正常处理)
307重定向:当网站升级后,为了避免用户在原网站无法使用又找不到升级后的网站以致于流失用户,所以会要求服务器自动转到升级后的网址
当某个请求所针对的资源不支持对应的请求方法时返回405,服务器不认识请求方法时返回501,特定的HTTP服务器支持扩展自定义的方法
状态码描述:OK表示请求成功,Badrequest语法有错,Unauthonzed未经授权,found拒绝提供服务,
NOTfound请求资源不存在,internalservalError服务器发生了错误,serviceUnavailable服务器暂时无法处理请求
响应头:allow(服务器支持哪些方法)、set-Cookie(用于把cookie发送到客户端浏览器)
HTTPS(超文本传输安全协议):是以安全为目标的HTTP通道,HTTP的安全版,http基于TCP/IP,而HTTPS是基于此再加一层SSL/TLS协议,加密传输
HTTPS默认端口443,HTTP默认端口是80
三、会话技术
HTTP是无状态的,没有对事务处理进行记忆,所以要保持登录状态才能避免,这就用到会话技术(区分同一个用户的连续请求):cookie(或cookies)和session
cookie(相当于一个凭证):网站为了辨别是否为同一个用户身份,进行session跟踪而储存在用户的本地终端上的数据,最新的规范是RFC6265
1、实际由服务器发放给客户端的一个特殊认证信息
2、以文本文件的方式存放
3、客户端每次发送请求的时候就会给服务器带上这个认证让其知道是哪个用户
获得cookie后,只需验证cookie就可以保持登录状态了
session:比如打开浏览器窗口到关闭这期间叫session,和cookie的区别是其目的:在打开浏览器到关闭这个期间,发起的所有请求都可以被识别为同一个用户
两者相反,session是存储在服务器上的数据,只由客户端传上来的sessionID进行判定,所以session的安全性更高,cookie可能会被篡改
一般sessionID会在浏览器被关闭时丢弃,或者服务器会验证session的活跃程度,一段时间不活跃,也会被识别为失效,session是基于cookie的,sessionID是一个暂时的cookie
例如:当用户输入密码被服务器验证成功之后,会在session表中存储一个key:hash值,然后给用户提供一个暂时的sessionID=hash的cookie认证(保留在浏览器上),
访问一些网页时(比如访问了QQ空间再去访问QQ邮箱)再次验证sessionID(前提是不关闭浏览器,在原有的基础上再去打开一个QQ邮箱),就可以,而不是验证密码
四、proxy代理
概念:代理实际指代理服务器,它的功能是代替用户获取网络信息,像一个网络中转站。有了代理服务器,web服务器就不用识别客户端的IP,只能识别代理服务器的IP,
这样我们本机的真实IP就被伪装起来。
作用:
1、突破自身IP访问的限制,访问一些自身IP不能访问的站点(比如国外服务器不允许国内用户访问,那么可以通过国外的代理服务器替自己国内用户访问)
2、访问一些单位或团体的内部资源:比如教育网内允许的地址IP内设代理服务器,就可以通过代理服务器去访问
3、提高访问速度:多了代理服务器这道工序,速度会下降。但代理服务器都会设置一个较大的硬盘缓冲区,
当再次访问相同信息时,就不用再访问web服务器,直接提取代理服务器的信息即可,以提高速度。
4、隐藏真实IP:免受攻击,防止自身IP被*
代理对爬虫的作用:用代理隐藏真实IP,让服务器误以为是代理服务器再请求自己,这样在爬取过程中通过不断更换代理,就不会被*。
socket(插座/套接字):面向对象的抽象层,介于应用层和传输层之间,使他们之间调用起来更容易(套接起这两个层),建立网络通讯可交互的指令串
建立服务端:
1、跳过套接字而言,server.bind建立域名
2、监听,server.listen(5)有5个监听员(观察谁会来连接)
3、等待连接,server.accept等待进行接待
4、接收数据conn.recv(1024),1024为限制的字节数
5、发送数据conn.send(response.encode())
6、关闭server.close()
接收到请求后发送,再接收到再发送
建立客户端:(通过客户端向浏览器请求下载下列域名所在的一个图片)
如果访问的是http
1、img_url=”http://ss0.bdstatic.com~~~~~“(图片域名)
2、client=socket.socket()
client.connect(”ss0.bdstatic.com“,80)建立连接
如果访问的是https(1、2点要变成)
1、import ssl(HTTPS的加密协议)
img_url=”http://ss0.bdstatic.com~~~~~“(图片域名)
2、client=ssl.wrap_socket(socket.socket())
client.connect((”ss0.bdstatic.com“,443))建立连接,这个连接函数connect要传元组进去才可以
3、构造请求报文(内容一定是一个字节码的格式,这里用二进制b解释)
data=b"GET/(/是上面连接的根目录)HTTP/1.0\r\nHOST~~~~~(具体就是请求行,请求头,空行,请求体)"
4、发送请求:
client.send(data)
res=b""(设置一个接收服务器给的图片字节码的变量来装载)
5、接收数据(可以设置一个循环的接收控制流程)
temp=client.recv(4096)(设置稳定的接收字节码数,稳定的接收4096的量)
first_data=client.recv(4096)
length=int(re.findall(b“Content-Length(.)\r\n”,first_data)[0](因为正则得到的是列表所以要0提取))(用正则提取字节长度,了解他的大小为了后面能及时停止)
image_data=re.findall(b“\r\n\r\n(.)”,first_data,re.S)(从first_data中把请求体提取出来)re.S可以让(.*)提取任意字符,包括不能被提取的换行符
为了避免浏览器给我们不返回数据,所以可以设置控制流程避免后面的程序出错
if image_data:
image_data=image_data[0]
else:
image_data=b""(如果不返回就赋值空)
while True:
temp=client.recv(4096)
image_data +=temp
print(temp.decode())(得到响应内容进行解析)
if len(image_data)==length:(当image_data提取的字节符数量和length一样的时候证明已经提取完了,就可以断开循环了)
break
6、断开连接
clien close()
with open(“socket_cat.jpg”,“wb”)as f: (把接收的装到一个文件中,没有socket_cat.jpg文件的,会自动在同级目录下创建)
f.write(image_data) (将image_data当作对象)
请求头中不能加cookie发起请求