网络数据采集
网络数据采集就说爬虫,爬虫程序就被称为蜘蛛程序spider
定义:
模拟浏览器上网,批量获取数据,获取的是既有数据
合法性:
爬虫本身不被法律禁止,但是具有违法的风险
不能影响网站是正常运营
不能攻击服务器
不能获取个人信息
反爬机制
网站设置一些机制,防止爬虫程序对数据的获取
验证 请求是否为浏览器
ip 请求过于频繁
需要登陆者的情况才能获取数据
反反爬策略
爬虫程序中针对反爬机制涉及对应的反反爬策略
添加请求头—构建—字典—user-agent----键 值 分别加引号
response.请求方式()
response = request.get(url,header=构造好的请求头)
伪装浏览器
休眠 代理ip 轮流使用 消费
登录 cookie
客户端和服务器端
客户端:供用户使用
服务器端:客户端显示的数据都是来源于服务器,服务器端给客户端提供数据
请求request
和响应response
–双R
客户端通过IP地址进行定位服务器,向服务器传递信息,发送一个请求,这个过程就是请求过程
服务器接受请求之后,查询相关的数据,找到对应的数据,返回给客户端,这个过程就是响应
请求方式
常见的两种 get
post
get
请求
明显特点 请求参数直接拼接url
【网址上】 ?key=value&key=value
,请求参数直接暴露,不安全
post
请求
不会把请求参数直接拼接在url
上,参数不会暴露出来,对比get
请求更安全
URL
网址的专业术语是URL
,称为统一资源定位符
通过网址定位对应的资源,只能是这个资源
格式:协议://域名或者ip地址:端口/资源路径?key=value&key=value
协议:信息的传递需要遵守一定的柜子,这个规则就是协议,http https
域名或者ip 定位服务器地址
资源路径 明确获取的资源在服务器的哪个位置
?key=value&key=value
请求参数
http
协议
超文本传输协议,是网络数据通信的基础
http
https
在 http
的基础上做了ssl
加密,保证数据传输更安全
http协议又被为请求-响应协议,客户端和服务器端请求与应答的标准
客户端向服务器传递信息称为请求,发请求的时候,携带请求报文
请求报文的组成部分
请求行 请求头 空行 请求体
请求行
请求方式 资源路径 协议/版本号
GET /s HTTP/1.1
请求头
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
用户代理
存储的是和操作系统、浏览器相关的信息
存储的是设备信息
Cookie:
BIDUPSID=CCA1EE0B899728C008C56A1E68CDC1F1; PSTM=1692545075; BAIDUID=CCA1EE0B899728C0BBFD543EB8ABBE27:FG=1;
存储的是和登录者相关的信息
空行
分隔请求头和请求体
请求头和请求体 都是 key:value 格式
请求体
请求参数 network-document- playload-储存的请求参数
服务器将数据返回给客户端,携带响应报文
响应报文组成 部分
响应行 响应头 空行 响应体
响应行
协议/版本号 响应状态码 响应状态啊描述信息
HTTP/1.1 200 OK
响应状态码
200 响应成功
403 禁止访问 没有权限
404 找不见 资源不存在 爬虫会遇到404 url有问题
418 检测到非正常请求
500 服务器异常
响应头
Set-Coolie:BD_CK_SAM=1;path=/
空行
分隔响应头和响应体
响应体
响应内容【响应状态码 响应文本数据text cookie 字节数据 编码方式encoding,apparencoding等】
http
本身是无记忆协议,需要cookie进行辅助记忆
当第一次进行访问,服务器一定是不认识的,给一个身份标识,放在set-cookie中,随着响应报文一起返回给客户端,当客户端接受到响应报文之后,获取set-cookie的身份标识,存储在客户端,下一次再发送请求的时候,客户端会将身份标识放在cookie中,随着请求报文一起发送给服务器,服务器接受到之后,检测里面有身份标识,登记为一个登陆者身份。
爬虫的流程
1.指定url
来源:网址栏粘贴出来;来源于页面的解析-图片的链接-页面中解析出来的图片的链接
2.发送请求,接受响应,获取响应数据 两个模块 用来发送请求 requests selenium
request
:三方模块、需要下载、pip install requests 、文件起名不要叫request
发送请求:requests.请求方式();response=requests.get(url)
获取响应数据: 响应状态码–response.stauts_codes
文本数据-response.text
字节数据-response.context
获取服务器响应的编码方式
获取内容的真是编码方式
3.解析数据【获取想要的数据】正则解析 bs4解析 xpath解析
正则: re模块
在字符串中匹配满足条件的所有-字符串中-字符串-data = response.text
re.find(正则表达式,data) ----返回结果是列表,想要某部分内容
4.保存数据 图片【视频、音频】html文件 txt文件 excel文件 csv文件 数据库
下载图片
1.指定url
2.对url
发请求 接受响应 获取响应数据
3.解析数据【图片的连接】
4.数据保存 【】
- 获取图片的链接
- 对图片链接发请求 接受响应 获取图片的字节数据
- 将字节数据写入到文件
wget模块
三方模块 下载 pip install wget
HTML的结构
html
是由标签组成
单标签 <标签名称 属性名=值 属性名=值 属性名=值 /> / 可以省略
双标签 <标签名称 属性名=值 属性名=值 属性名=值>标签之间的内容</标签名称>
标签与标签之间可以相互嵌套:
三种关系
- 父子关系 : 直接包含与被包含
- 兄弟关系: 被同一个父标签包含
- 先辈与后辈关系:直接或者间接包含与被包含 【包含父子】
<!DOCTYPE html> 声明这是一个html文档
<html lang="en">
<head>
<meta charset="UTF-8"> 指定编码方式的
<title>Title</title>
</head>
<body>
</body>
</html>
css选择器解析
bs4 全称 BeautifulSoup4
bs4 从html中提取数据
三方模块 需要下载 pip install bs4
解析原理
1. 实例化一个 BeautifulSoup对象,把页面的源码数据加载到该对象中
2. 通过调用方法进行标签的定位与内容的提取 【重点 定位标签 思路:找到一个能够进行唯一定位的位置 】
使用步骤
from bs4 import BeautifulSoup
1. 获取页面的源码数据 -- data = response.text 字符串
2. 实例化一个 BeautifulSoup 对象
BeautifulSoup(data,解析器)
html_data = BeautifulSoup(data,'html.parser')
html_data 标签
3. 进行标签定位
html_data.select(css选择的语法) 找所有
html_data.select_one(css选择的语法) 找一个
css选择器
1. id选择器
标签中具有id属性 id值在html中的是唯一
通过id值唯一定位到这个标签
<div id="haha" class="heihei">
使用方式 #值
#haha
2. class选择器 类选择器
标签中具有class属性 class值可以有多个 html中可以有多个相同的class对应的值
配合搜索情况 ctrl+F 如果搜索出来个数是1 表示唯一
<div class="heihei">
使用方法 .值
.heihei -- 表示 定位到具有class=heihei的标签
但是
<div class="heihei huhu"> 多个之间使用空格分隔
使用类选择器 只能选择其中的一个值使用 选择更能够进行唯一定位的
.heihei
.huhu
3. 包含选择器 父子关系 先辈与后辈关系
父子关系 > 父选择器>子选择器
先辈与后辈 空格 父选择器 子选择器
4. 标签选择器 元素选择器
直接使用标签名称进行定位
<div class='haha'>
<p class='haha'>
div
5. 兄弟选择器 兄弟关系
~
A~B
选择A标签后的所有的B标签
+
A+B
选择A标签后紧邻的那一个兄弟B
6. 属性选择器
属性 -- 标签名称后 以key=value 中key都叫属性
属性中 id class 比较特殊 赋予两个单独的符号 # .
id class 也是属性 也可以用于属性选择器
选择器[属性名] 具有某个属性名 且选择器对应的标签
div[content] 找具有content属性的div标签
选择器[属性名=值] 具有某个属性名且对应的值为指定内容的选择器
div[content="haha"] 找具有content属性并且对应的值为haha的div标签
选择器[属性名^=指定内容] 具有某个属性名且对应的值以指定内容开头的选择
div[content^="h"] 找具有content属性并且对应的值以h开头为h的div标签
选择器[属性名$=指定内容] 具有某个属性名且对应的值以指定内容结尾的选择
div[content$="h"] 找具有content属性并且对应的值以h结尾为h的div标签
选择器[属性名*=指定内容] 具有某个属性名且对应的值包含指定内容的选择
div[content*="h"] 找具有content属性并且对应的值包含h的div标签
7. 结构选择器
找某个选择器下的第n和或者倒数第n个
第一个
父选择器>子选择器:first-child
第n个
父选择器>子选择器:nth-child(n)
倒数第一个
父选择器>子选择器:last-child
倒数第n个
父选择器>子选择器:nth-last-child(n)
注意:执行顺序
先找负选择器中的第n个 验证是否满足子选择器
举例
父亲
儿子
女儿
儿子
女儿
女儿
女儿
父亲>儿子:last-child 找不到
找父亲的最后一个孩子 验证是否是儿子 如果是 找到了 如果不是 找不到
父亲>女儿:first-child
父亲>女儿:nth-last-child(2)
8. 全局选择器
* -- 任意
*[content]
所有具有content属性的标签
获取详情页数据
- 获取详情页链接 解析出来
- 对详情页链接发请求 接相应 获取响应数据
- 解析数据
JSON数据
是一种轻量级的数据交换格式,常用于服务器向客户端传输的一种格式
要进行网络传输,最终的数据类型都是字符串,还得是具有一定格式的字符串,也就是JSON数据
常见的格式
[{key:value,key:[]},{key:value},{}]
{key:[],key:value,key:[]}
序列化和反序列化
序列化:将程序中的对象【字典包列表或者列表包字典】转化为字符串,还可将内容存储到文件中
反序列化:将字符串【可以是文件中内容】转化为程序中的对象
python中提供进行序列化和反序列操作的模块 json
序列化
json.dump
json.dumps
反序列化
json.load
json.loads
不带s的一组 和文件相关