python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
一丶爬虫概述
通过编写程序'模拟浏览器'上网,然后通过程序获得互联网中爬取数据的过程
二丶爬虫分类
通用爬虫:
# 爬取一整张页面源码数据.搜索引擎(抓取系统,内部封装的一套爬虫程序). 重点使用的是该种形式的爬虫
聚焦爬虫:
# 抓取的是页面中指定的局部数据
增量式爬虫:
# 监测网站的数据更新情况. 抓取的是网站最新更新的数据
三丶爬虫安全性
风险所在
爬虫干扰了被访问网站的正常运营;
爬虫抓取了受到法律保护的特定类型的数据或信息
如何规避风险
严格遵守网站设置的robots协议;
在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除
四丶反爬机制
#解释: 应用在网站中
五丶反 反爬机制
#解释: 应用在爬虫程序中
六丶反爬机制
rebotes协议:
纯文本协议,特点是:防君子不防小人
# https://www.taobao.com/robots.txt
User-agent: Baiduspider
Allow: /article
Allow: /oshtml
Allow: /ershou
Allow: /$
Disallow: /product/
Disallow: /
User-Agent: Googlebot
Allow: /article
Allow: /oshtml
Allow: /product
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: /
UA检测:
# 每一个网站都存在User-Agent检测.
# User-Agent:请求载体身份标识
通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。
# 反爬机制:
某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。
# 反反爬策略:
将爬虫程序的UA伪装成某一款浏览器的身份标识。
八丶加密方式
对称加密
# SSL 对称加密技术
# 1.客户端采用已知算法对信息进行加密,如MD5 和 Base64,
# 2.通过网络传输,中间会传递密钥.加密和解密是同一个秘钥. 秘钥是被加密传输的.
# 3.存在潜在的风险,一旦被窃听,秘钥和信息都会被窃取.就可以轻而易举的破解秘钥
非对称加密
# 解释: 存在两把锁, 一个是 '私有秘钥' ,一个是 '公有秘钥'. 服务器端生成一对公私秘钥,把公钥发给客户端,客户端根据公钥进行加密,并把加密过后的数据发送给服务端,服务端利用私钥进行解密. 这样避免了网络传输中数据被窃取,就算数据被窃取,没有私钥也解不开加密的信息. 此种加密方式比较耗费资源和事件. 例如RSA就是采用非对称加密
# 缺点:
第一个是:如何保证接收端向发送端发出公开秘钥的时候,发送端确保收到的是预先要发送的,而不会被挟持。只要是发送密钥,就有可能有被挟持的风险。
第二个是:非对称加密的方式效率比较低,它处理起来更为复杂,通信过程中使用就有一定的效率问题而影响通信速度
证书加密
# 解释:
1. 服务器的开发者携带公开密钥,向数字证书认证机构提出公开密钥的申请,数字证书认证机构在认清申请者的身份,审核通过以后,会对开发者申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将密钥放在证书里面,绑定在一起
2. 服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端可以通过数字证书中的数字签名来验证公钥的真伪,来确保服务器传过来的公开密钥是真实的。一般情况下,证书的数字签名是很难被伪造的,这取决于认证机构的公信力。一旦确认信息无误之后,客户端就会通过公钥对报文进行加密发送,服务器接收到以后用自己的私钥进行解密。
九丶HTTP和HTTPS
HTTP协议
### HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
### 需要记住的重点: HTTP协议就是服务器(Server)和客户端(Client)之间进行数据交互(相互传输数据)的一种形式。
### HTTP四点注意事项:
- HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTPS
# 概念:
HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
加密版的HTTP如图,采用证书加密:
常见的头信息
# 请求头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
X-Requested-With: XMLHttpRequest 代表通过ajax方式进行访问
User-Agent:请求载体的身份标识
# 响应头
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache
七丶requests模块的使用
# 概念:基于网络请求的模块
# 作用:用来模拟浏览器发请求,从而实现爬虫
### 编码实现的实现流程
# 1.指定URL
# 2.发起请求
# 3.获取响应数据
# 4.持久化存储
乱码问题:
# 将响应数据的编码格式手动进行指定
response.encoding = 'utf-8'
UA问题:
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
动态数据:
### 参数的动态
# GET 请求
params={
'key':'value',
}
# POST 请求
data={
'key':'value',
}
###
# response.json() 返回序列化好的JSON串数据或对象
# response.text 返回字符串形式的数据
### 总结
对一个陌生网站进行数据抓取时,首先确定爬取的数据是否是动态加载出来的.
- 是: 需要通过抓包工具捕获到动态加载数据对应的数据包.从中提取URL和餐胡
- 不是:直接对浏览器地址栏的URL发起请求即可
## 如何检测爬取的数据是不是动态加载出来的
通过抓包工具进行局部搜索来验证是否是动态加载
- 搜索到: 不是动态加载
- 搜索不到: 是动态加载,可以使用抓包工具 '全局搜索进行定位'