爬虫基本原理
一、爬虫基础简介必备知识
三种爬虫方式
通用爬虫: 抓取系统重要组成部分,获取的是整张页面数据
聚焦爬虫: 建立在通用爬虫之上,抓取页面指定的局部内容
增量式爬虫: 检测网站数据更新的情况,只抓取更新出来的数据
**robots.txt协议: 君子协议,规定网站哪些数据可不可爬
**http协议: 服务器和客户端进行数据交互的一种形式。
https协议: 安全的超文本传输协议(证书秘钥加密))
请求头:
-
User-Agent: 请求载体的身份标识
-
Connection: 请求完毕后,是否断开连接或者保存连接
响应头:
- content-Type: 服务器响应回客户端的数据类型
加密方式:
- 对称秘钥加密
- 非对称秘钥加密
- 证书秘钥加密
二、爬虫的基本流程(四步曲)
发送请求 ---> 获取响应内容 ---> 解析内容 ---> 保存数据
1.发送请求: 向目标站点发送一个Request, Request包含了请求头,请求体等参数
2.获取响应内容: 服务器响应回来的Response,包含了html,json,图片等数据
3.解析内容: 解析Response数据。(正则,第三方库。。。)
4.保存数据: Mysql ,本地文件file,MongoDB,Redis。。。
三、Request
1.请求方式:
GET,POST,HEAD,PUT,DELETE,OPTHONS。。。
GET请求携带的参数拼接在url,POST请求携带的参数放在请求体内,存放在form data
2.请求url:
url全称统一资源定位符 https://www.baidu.com/s?wd=靓仔
中文·靓仔·会被解码
3.请求头:
User-agent:告诉它这是浏览器发过来的请求(请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户)务必加上
host:
cookies:cookie用来保存登录信息
Referer:上一次的跳转路径
一般做爬虫都会加上请求头
4.请求体:
如果是get方式,请求体没有内容
如果是post方式,请求体是format data
ps:
1、登录窗口,文件上传等,信息都会被附加到请求体内
2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post
请求例子一:
import requests
from urllib.parse import urlencode
# 请求方式
kwords = input('请输入关键字:>>>').strip()
res = urlencode({'wd': kwords}) # 使用urlencode可以解析中文
url = "https://www.baidu.com/s?" + res
# 请求头
baidu_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 chrome-extension",
}
# 发送请求
response = requests.get(url, headers=baidu_headers)
print(response.status_code) # 响应状态码
print(response.text) # 返回的html
# 保存数据
with open('search.html', 'w', encoding='utf-8') as f:
f.write(response.text)
print('保存成功')
实例二:
import requests
# 请求方式
kwords = input('请输入关键字:>>>').strip()
# 使用urlencode可以解析中文
url = "https://www.baidu.com/s?"
params = {'wd': kwords}
# 请求头
baidu_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 chrome-extension",
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
}
# 发送请求
response = requests.get(url,
params=params,
headers=baidu_headers,
)
print(response.status_code) # 响应状态码
# print(response.text) # 返回的html
# 保存数据
with open('search1.html', 'w', encoding='utf-8') as f:
f.write(response.text)
print('保存成功')