导图社区 Python爬虫大数据采集与挖掘复习归纳
Python爬虫大数据采集与挖掘复习归纳,大数据处理各个环节:① 数据采集、② 结构化处理、③ 数据存储、④ 分析挖掘、⑤ 可视化、⑥ 共享交易。
编辑于2023-06-19 00:08:21 贵州Python 爬虫大数据采集与挖掘
1_概论
互联网大数据的特征
4V
Volume (数据量大)
Variety (数据种类多)
Velocity (处理速度快)
Value (价值密度低)
5V
Volume (数据量大)
Variety (数据种类多)
Velocity (处理速度快)
Veracity (真实性)
Variability (易变)
7V
Volume (数据量大)
Variety (数据种类多)
Value (价值密度低)
Velocity (处理速度快)
Veracity (真实性)
Validity (合法性)
Visualization (可视化)
归纳 : 5V = 4V - Value +(Veracity , Variability) 7V = 4V + Veracity + Validity + Visualization(真法视)
爬虫大数据采集技术架构 (自下而上)
网络连接层
主要由TcpSocket连接的建立,数据传输以及连接管理组成
爬虫执行过程中可能需要重连Web服务器,为了减少域名到IP地址转换的时间,通常要支持优化的DNS缓存
页面采集层
主要包括对URL的处理,从中提取域名,并按照Robots规范决定URL的抓取许可,同时在面对众多的爬行任务时需要按照一定的搜索策略来决定URL的抓取顺序.
页面提取层
主要完成HTML文本信息的处理,主要是从中提取超链接,正文信息等内容,需要按照相应的HTML编码规范进行提取.
领域处理层
主要有主题爬虫,DeepWeb爬虫等,普通爬虫没有这一层
大数据采集(爬虫)技术的重要性
大数据处理各个环节
① 数据采集
② 结构化处理
③ 数据存储
④ 分析挖掘
⑤ 可视化
⑥ 共享交易
数据采集是整个大数据架构的基础
低质量的个人,小型爬虫存在的问题
① 不遵守Robots协议
② 爬虫策略没有优化,没有对web页面的具体特征做优化
③ 多线程编程没有作用
2_Web页面及相关技术
HTML语言规范
HTML
Hyper Text Markup Language 超文本标记语言
HTML的基本结构
<html> <head></head> <body></body> </html>
常见HTML头部标签
<head>
定义关于HTML的信息
<title>
定义HTML页面的标题
<base>
定义页面上所有连接的默认地址或默认目标 基地址
<link>
定义HTML与外部资源之间的关系
<link rel="stylesheet" type="text/css" href="#css文件的路径">
<meta>
定义HTML的元数据 如:charset
<script>
定义客户端脚本文件
<style>
定义HTML中样式的文件
CSS
Cascading Style Sheet 层叠样式表
作用
修改HTML页面的外观
使用方法
内联样式 (单个标签)
直接在单个标签中添加 style 属性
内部样式表 (单个页面)
通常在头部,即<head>中使用<style>标签控制本页面中的标签内容外观
外部引用 (多个页面)
通常在头部中使用 <link> 标签给出css文件的路径
<link rel="stylesheet" type="text/css" href="#css文件的路径">
然后在需要使用css渲染的标签内添加 选择器选择的属性 如class或id等
与爬虫相关的HTML标签
<meta>
HTML文档的元数据
主要包括 : 字符编码 , 关键词 , 页面描述 , 最后修改时间
最常用的是 charset字符编码 属性
<p>
段落标签
会在段前段后添加一些空白
<div>
分区标签
将页面分割成独立的部分,常用于网页布局
<table>
表格标签
<table>的子标签
<tr> 行
<th> 列
<td> 单元格
属性 border 边框
实例
实例结果
<a>
定义超链接
最重要的属性是 href 即跳转链接的目标URL
<form>
定义 表单 , 服务端接收用户输入的数据
重要属性
action
服务器地址或servlet对应的url-pattern
method
get (获取)
post (提交)
<base>
页面中所有超链接的基地址
<script>
用于在HTML中插入脚本
type 是必选属性 , 指定脚本的MIME类型
爬虫程序更加关注HTML的主体,即<body>部分
编码体系与规范
国内常见编码方式
UTF-8
国际化编码
GBK
GBK是GB2312的扩展增加了近20000个新汉字
范围
0x8140 ~ 0xFEFE
GB2312
共收录6763个汉字,每个汉字占两个字节
范围
0xA1A1 ~ 0xF7FE
ASCII
128个字符
范围
0~127 即二进制 (00000000~11111111)
ASCII表
助记的ASCII编码
ASCII(48) => 0
ASCII(65) => A
ASCII(97) => a
Tip : ASCII总共128个 , 分为4列每列32个
Unicode
Python3 的默认编码为 Unicode
范围
0 ~ 0x10FFFF 0 ~ 1114111
编码转换
转换流程
方法
encode( ) 编码
将字符串为特定编码如(gbk,utf-8)等的二进制字节串
decode( ) 解码
将特定编码的二进制字节串转换为字符串
encode( ) 和 decode( ) 默认的编码参数都是UTF-8
代码演示
使用 chardet 自动检测编码
代码演示
结果
主要方法
chardet.detect( )
正则表达式
原理
使用一段特定的表达式来代替已有的字符串
主要功能
匹配和搜索
分割字符串
匹配和替换
Python实现介绍
导入 re 库(Python内置) import re
主要功能函数 及使用范例
re.search( )
在字符串中搜索匹配
实例
参数说明
search(pattern, string, flags=0)
pattern : 正则表达式
string : 待匹配的字符串
flags=0 : 匹配模式
re.match( )
在字符串开头位置中开始匹配
实例
参数说明
match(pattern, string, flags=0)
pattern : 正则表达式
string : 待匹配的字符串
flags=0 : 匹配模式
re.findall( )
在整个字符串中匹配所有符合正则表达式的子字符串
实例
结果
参数说明
findall(pattern, string, flags=0)
pattern : 正则表达式
string : 待匹配的字符串
flags=0 : 匹配模式
re.split( )
将一个字符串按照正则表达式进行分割,返回列表
实例
结果
参数说明
split(pattern, string, maxsplit=0, flags=0)
pattern : 正则表达式(用以切割字符串)
string : 待匹配(切割)的源字符串
maxsplit : 切割次数 默认全部切分
flags=0 : 匹配模式
re.finditer( )
搜索字符串并返回一个可迭代类型,,其中每个对象是match对象
实例
结果
参数说明
finditer(pattern, string, flags=0)
pattern : 正则表达式
string : 待匹配的字符串
flags=0 : 匹配模式
re.sub( )
使用一个特定的字符串替换正则匹配到的所有字符串
实例
结果
参数说明
sub(pattern, repl, string, count=0, flags=0)
pattern : 正则表达式
repl : 用以替换的字符串
string : 正则去匹配的原字符串
count=0 : 匹配次数 默认为0即表示全部替换
flags=0 : 匹配模式 可以用 re.S或re.M这种形式传参
匹配模式 flags
re.I (IgnoreCase)
忽略大小写
re.L (Locale)
表示 \w\W\b\B\s\S 等与本地字符集有关
re.M (MultLine)
多行匹配模式
re.S (Dotall)
使元字符也能匹配换行符
re.U (Unicode)
匹配Unicode字符
re.X (Verbose)
忽略空格
元字符
. (点)
任意单个字符
+ (加)
前面的字符匹配 1次到无限次
* (星)
前面的字符匹配 0 次到无限次
?
前面的字符匹配 0 次或者 1 次
[ ]
字符集 , 如[A-Z]即从A到Z这个范围中的任何字符
[^ ]
非字符集 , 即不要 [ ] 中的任何字符
^
正则表达式起始符
$
正则表达式结束符
( )
分组
{ }
重复次数
元字符集
\d
数字
\D
非数字
\s
空白
\S
非空白
\w
单词
\W
非单词
匹配超链接的正则表达式 (提问过多次)
http://[a-zA-Z0-9/\.\-]*
实例
结果
小Tip
Python中 正则表达式 默认会贪婪匹配
贪婪匹配 : 如果有很多条字符串能够被正则表达式匹配,则取最长的子串
? 可以用于最小匹配
3_Web应用架构及协议
常用的Web服务器软件
服务器
安装了服务器软件的计算机
接收用户请求,处理请求,做出响应
常见的Web服务器软件
Apache
简单速度快性能稳定
Nginx
高性能支持反向代理
IIS(Internet Information Server)
微软主推 集成在 Windows Server 中
Lighttpd
Zeus
Resin
tomcat
典型的Web应用架构
Client/Server 架构
静态网页
适用于静态页面 , 每一个静态页面对应硬盘上的一个文件
Client/Server/Database 架构
动态网页
页面中存在一些动态脚本 , 在执行过程中需要访问数据库
由于动态页面中的主体内容来自数据库 , 所以访问会小号更多的服务器资源 , 可能会导致响应时间更加长
Web服务器集群
大量用户并发访问
具有高可用和负载均衡的设计
虚拟主机架构
可以在一台服务器上部署多个网站,使每一个网站看起来都具有独立的物理计算机
基于IP地址的方法
一台计算机配置多个(虚拟)网卡 , 使得具有不同的IP
(常用)基于端口的方法
不同端口映射不同的服务
基于主机名的方法
设置DNS将多个域名解析到同一个IP地址
Web页面的类型
静态页面
仅需要Web服务的支持
HTML文件存在服务器的硬盘上
动态页面
除了Web服务,还需要数据库和其他计算存储服务
有明显的交互性,页面可动态变化
伪静态页面
为了增强搜索引擎爬虫的友好界面
以静态页面展示,实际是用动态脚本来处理的
将静态的URL页面请求转化为内部的动态访问
Robots协议
Robots协议
又称为 爬虫协议 机器人协议
全程是 Robots Exclusion Protocol 即网络爬虫协议
查看某个网站的Robots协议
在网站首页url后方添加 /robots.txt
! 注 : 考试的时候 / 斜杠 不能少
操作示例
查看 百度 的 robots协议
查看 淘宝 的 robots协议
Python解析Robot协议
① 导入相应的包
from urllib.robotparser import RobotFileParser
② 创建一个 RobotFileParser 对象
rb = RobotFileParser( )
③ 设置网站的robots协议url
rb.set_url("http://www.baidu.com/robots.txt")
要将url具体到robots协议的位置
rb.read( )
④ 设置需要获取响应的url
rb.can_fetch("#具体需要爬虫的某个页面")
返回 布尔值(True|False)
!注: 其中需要将rp对象读取一下(实际代码需要读)
实例
实例结果
urllib.robotparser.RobotFileParser( ) 的其他方法
request_rate( ) 爬取频率
crawl_delay( ) 爬取延时
HTTP协议
HTTP各个版本技术特性
HTTP 0.9
1991年
第一个版本
只支持 GET 方法
HTTP 1.0
1996年
支持 GET POST HEAD 等请求方法
引入了MIME机制
点击了解MIME =>
除了纯文本之外还支持 图片 音频 视频等多媒体数据
加入了 Connection : keep-alive 属性保持连接(不断开TCP连接)
HTTP 1.1
1997年
是目前应用最广泛的HTTP协议版本
HTTP1.1默认采用了持久性连接 , 所以不用另外指定Connection : keep-alive
支持管道(pipelining)方式 , 可以同时发送多个请求
添加了HOST请求 , 可以访问虚拟主机上的指定网站
HTTP 2.0
2015年
性能提高了 , 但是没有真正应用
HTTP报文
请求报文
组成 : 起始行 + 请求头部(header) + 实体(entity-body)
格式
<method><request-URL><version> <headers> <entity-body>
<请求方法><请求URL><HTTP协议版本> <请求头> <请求实体>
注 : 请求头之后有一个回车表示请求头结束
请求报文头部源码实例
格式化
源码
请求头部中常见属性 (按考试重要程度降序)
Accept
表示可接受的响应内容
User-Agent
表示客户端的身份标识
格式 : 浏览器标识 ( 操作系统标识 ; 加密等级标识 ; 浏览器语言 ) 渲染引擎标识 版本信息
示例 : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Cookie
存储了客户端的一些重要信息 , 如身份标识 所在地区等 避免了用户重复输入 以一个文本文件的形式保存在客户端本地 可能会造成泄露信息
类似 Cookie 的还有 Session
Session用以保持连接状态 文件保存在服务端
Connection
请求头和响应头都有的属性
常见的是 Connection : keep-alive 用以保持连接
但是 如果Web服务端设置了keep-alive的超时时间话 , 也保持不了多久的连接
Host
表示服务器的域名以及服务器所监听的端口号
Referer
表示当前请求是从哪一个页面跳转过来的
Range
Warning
响应报文
组成 : 起始行 + 相应头部(header) + 实体(entity-body)
格式
<version><status><reason-phrase> <headers> <entity-body>
<HTTP协议版本><状态码><原因短语> <响应头> <响应实体>
注 : 响应头部之后有一个回车表示请求头结束
响应报文报文实例
格式化
源码
响应头部中常见属性 (按考试重要程度降序)
Content-Type
表示响应体的MIME类型
如 :
text\html HTML格式
text\plain 纯文本格式
application\json Json数据格式
application\msword Word文档格式
应该是在爬虫中最关注的响应头属性
Date
响应时间
北京时间 = GMT(格林威治时间) + 8
Connection
Connection : keep-alive
Content-Length
表示响应体的长度
Content-Language
响应内容使用的语言
Server
Content-Range
Set-Cookie
HTTP状态码
100 ~ 199
信息响应,表示服务器已经收到请求需要继续处理
100 Continuue 所有内容都可行客户端应该继续请求
101 Switching Protocol 由客户端请求头发送 , 表明服务器即将切换的协议
102 Processing 服务器已收到请求 , 但是暂无响应可以使用
103 Early hints 常与连接头一起使用 , 用于预加载资源
200 ~ 299
成功响应请求 (被成功接收并处理)
200 OK 请求成功
201 Created 请求成功并创建了一个新资源 常常用于POST或某些PUT的请求
202 Accepted 请求已收到 , 但是暂未响应
203 Non-Authoritative Information 服务器成功处理请求 , 但是返回的数据可能不是原始版本
204 No Content 请求无内容但是请求头可能有用
300 ~ 399
重定向 , 表示需要采取进一步操作才能完成请求
300 Multiple Choice 请求拥有多个响应 用户在其中选一个
301 Moved Permanently 请求的URL已永久更改 , 在相应中给出了新的URL
302 Found URL暂时修改
303 See Other 服务器提示客户端通过一个GET请求从另一个URL中获取所请求的资源
304 Not Modified 客户端发送的请求已经被允许 , 但文档内容没有改变 , 用于缓存
400 ~ 499
客户端的请求可能错误
400 Bad Request 错误的请求语法 或 欺骗性的请求路由
401 Unauthorized 客户端用户没有验证身份
403 Forbidden 权限不够或无权限
404 Not Found 服务器找不到资源 可能是URL不存在 也有可能是资源不存在
407 Proxy Authentication Required 需要代理认证
408 Request Timeout 服务器可能关闭了空闲的连接
422 Unprocessable Entity 请求格式正确但是语义错误 (请求实体错误)
423 Locked 正在访问的资源已锁定
429 Too Many Requests 用户在指定的时间内发送了过多请求
451 Unavailable For Legal Reasons 由于法律原因无法提供资源
500 ~ 599
服务端可能在处理请求的过程中发生错误
500 Internal Error 服务器遇到未知错误
501 Not Implemented 服务器不支持请求方法
502 Bad Gateway 服务器作为网关得到一个错误的响应
503 Service Unavailable 常见的 服务器正在维护或者宕机
504 Gateway Timeout 服务器作为网关没有及时得到响应
505 HTTP Version Not Supported 服务器不支持请求的HTTP版本
511 Network Authentication Required 客户端需要认证才能获得网络访问权限
HTTPS
HTTP 80端口 HTTPS 143端口
HTTPS是使用了SSL加密的HTTP协议
HTTPS(超文本传输安全协议)
SSL(Secure Socket Layer) 安全套接层
状态保持技术
Cookies
以文本的形式存在客户端本地 , 其中包含用户的身份标识等信息
cookies虽然可以灵活的增加Name和value 但是每个域名的cookies的数量和大小是受限的
Cookies存在一定的安全风险 , 信息很容易被截获
Session
保存在Web服务器上
客户端与服务器通过一个 全局唯一标识的Session_id来访问Session中的数据
小Tip
Python3 中提供了小型Web服务器软件的功能
构建示例
在Web项目的路径中进入cmd
输入 python -m http.server 端口号
允许通过防火墙
在浏览器中查看服务
4_普通爬虫页面采集技术
普通爬虫
主要目的
在于获取数量尽可能多的页面
普通爬虫的体系架构
具体流程描述
① Web服务器连接器向指定的Web服务器发起连接请求 , 再建立爬虫和Web服务器之间的网络连接 (为减少域名到IP地址之间的映射时间,需要使用DNS缓存)
② 在该连接上向Web服务器发送URL页面请求命令 , 并等待Web服务器的响应
在发送请求前 , 应当检查其根目录下是否具有robots.txt文件
③ 对获取到的HTML文件进行URL提取和过滤
④ 根据一定的爬虫策略 , 将每个URL放入到URL任务中的适当位置
Web服务器连接器
整体处理流程
① 输入 URL
② 处理过程
③ 输出 HTML文件
处理过程
① 从URL中提取域名和端口号 , 端口号为空则默认为80
② 以域名和端口号为参数 , 建立Socket连接
③ 建立连接后 , 检查服务器的根目录(首页) 是否存在robots.txt文件
④ 若存在则解析robots.txt文件 , 生成许可列表和服务器对访问要求的参数
⑤ 根据许可列表和时间访问限定 , 如果允许的话 , 则向服务器发送URL请求
⑥ 等待服务器响应
⑦ 进行异常处理 , 针对各种已知的HTTP标准错误代码 , 做好预案
⑧ 接收服务器返回的数据 , 把数据保存到文件中
⑨ 断开网络连接
DNS缓存
DNS (Domain Name System) 域名系统
将域名 (www.baidu.com) 解析为对应的 IP地址(120.232.145.144) 从而定位到具体的服务器主机
Python实现DNS缓存
基本流程
① pip install dnsython
安装dnspython第三方库
② import dns.resolver
导入dns域名解析resolver的包
③ res = dns.resolver.resolve("#Domain")
将域名传入resolve方法中
返回一个dns.resolver Answer对象
④ [ip.address for ip in res]
使用一个列表生成式将所有的解析对象中的ip对象存入一个列表中
实例实现
实例结果
request/response的使用方法
requests 的函数
requests.request( )
用于构造一个请求
requests.get( )
发送一个GET请求
获取HTML网页
requests.head( )
发送一个HEAD请求
获取HTML网页头部信息
requests.post( )
发送一个POST请求
向HTML网页中提交POST请求(表单)
requests.put( )
发送一个PUT请求
向HTML网页中提交PUT请求
requests.patch( )
发送一个PATCH请求
向HTML网页中提交一个局部修改PATCH请求
requests.delete( )
发送一个DELETE请求
向HTML页面提交删除请求
requests.Session( )
在不同的请求中 , Web服务器保持某些参数
requests.get( )的参数说明
get(url, params=None, **kwargs)
url : 要获取请求的url
headers : 请求头中的参数 , 键值对 , 如 : →
通常可以在浏览器请求报文中获取
params : 请求中的一些控制参数 , 键值对 , 如 : →
通常在浏览器请求报文的负载(payload)中就可以找到
通常有控制页数 , 关键词的参数都在params里面
cookies
字典或者CookieJar , 从http中解析cookie
proxies
设置代理服务器
data
字典 , 与params作用差不多 , 但是不放在URL中而是放在对应的地方
在requests.post( ) 中 不使用params 控制参数为data
json
Json格式数据 , 作为部分内容提交到服务器
timeout
用来设置超时时间
requests.get( )的使用 (静态页面获取)
① 使用浏览器模拟查看响应的参数
② 使用 requests.get("#URL") 直接发起请求
③ 查看 response.text 查看响应的文本内容
④ 可以 使用open方法将获取到的html文本持久化到本地
⑤ 可以 使用各种解析器提取html中各个标签中的内容
requests.get( )结果的一些属性
status_code
返回状态码
text
返回response的字符串形式
content
返回response的二进制形式
json
返回response的json格式
主要要在浏览器的响应报文中看一看Content-Type是什么类型
encoding
返回猜测的编码方式
apparent_encoding
返回分析出的编码方式
超链接以及域名的提取与过滤
① 使用正则提取所有超链接
re.findall("http://[a-zA-Z0-9/\.\-]*" , html_str)
② 使用各种解析器提取超链接
抓取二进制文件(图片视频等)的实例
requests.get( ).content