1、分类:
2、 流程:
3、http/https协议
http协议:超文本传输协议,默认端口为80,明文传输;
https协议:http+ssl(安全套接字层),对传输内容加密,默认端口为443;
爬虫主要关注的请求头与响应头:
1)Content-type:内容类型(document文本内容、png图像文件)
2)host:域名
3)connection:连接类型,keep-alive(长连接)
4)Upgrade-Insecure-Requests:升级为https请求(307重定向)
5)User-Agent:用户代理(系统信息以及浏览器信息)
6)Referer:页面跳转处(用于检验是否为爬虫访问,防盗链(图片/视频))
7)Cookie:状态保持,有时效性
响应头:set-cookie:服务器设置cookie到用户浏览器的缓存
4、响应状态码:200(成功)、302(跳转,新的url在响应的location中)、303(post重定向)、307(get重定向)、403(资源不可用,拒绝访问)、404(找不到页面)、500(服务器内部错误)、503(服务器受访问过多,负载过高,无法响应),
network抓包不要看element返回的源码,要看具体文件的response源码!!!
5、Requests模块 —— get()
Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档
1)发送请求:url->requests.get(url)-> .text
2)响应对象:手动修改编码格式:response.encoding='utf8';
3)两种返回对象区别:response.text:str; response.content:bytes; response.content.decode()解码,里面可以传'utf-8','GBK','iso-8859-1'等等编码字符集
4)常见响应对象属性:
url = "www.baidu.com"
response = requests.get(url)
response.encoding = 'utf8' ##手动设定编码格式
print(response.url) ##响应url
print(response.status_code) ##状态码
print(response.request.headers) ##响应对应的请求头
print(response.headers) ##响应头
print(response.cookies) ##响应的cookies
print(response.json()) ##自动将json字符串类型的响应内容转换成python对象
5)请求头:
import requests
url = "http://www.baidu.com"
response = requests.get(url)
print(len(response.text))
print(response.content.decode())
#请求头
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
response1 = requests.get(url,headers=header)
print(len(response1.text))
6)发送带参数的请求,第一种是直接url直接加上参数;
url = "https://www.baidu.com/s?wd=python"
第二种是构造参数字典,get()传入
data = {'wd':'python'}
url = "https://www.baidu.com"
response = request.get(url,params=data)
7)发送带有cookie参数,模拟保持登录
参数字典header:
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
'Cookie':'BIDUPSID=B3C094FD6A0FEE417C2703340B4AF2DTM=1603963404BDUSS=RvbTFia3BaLUJzcVJhSXJLS1ozWjIzeHJXb0N1YjlYQnVWcEd6LTZ3VmRrZDlmSVFBQUFBJCQAAAAAAAAAAAEAAAB9t594uKG7qrS10akAAAAAAAAAAAAAAAAAAAAAA'
} ##随便复制了一些
url = "https://www.baidu.com"
response = requests.get(url,headers=headers)
更优雅的写法,将cookie写成字典:
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
cookies='BIDUPSID=B3C094FD6A0FEE417C2703340B4AF2DTM=1603963404BDUSS=RvbTFia3BaLUJzcVJhSXJLS1ozWjIzeHJXb0N1YjlYQnVWcEd6LTZ3VmRrZDlmSVFBQUFBJCQAAAAAAAAAAAEAAAB9t594uKG7qrS10akAAAAAAAAAAAAAAAAAAAAAA'
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[1] for cookie in cookies.split(';')}
url = "https://www.baidu.com"
response = requests.get(url,headers=headers,cookies=cookies_dict)
8)超时参数timeout,表示当超过这个时间,则访问取消(强制停止,节省时间)
response = requests.get(url,timeout=3) ##超时为3s
9)代理使用:代理ip是一个ip,指向一个代理服务器,负责帮助用户端向服务端转发请求
正向代理:浏览器知道最终处理请求服务器的真实ip地址,比如vpn
反向代理:浏览器不知道最终服务器真实ip地址,为服务端进行负载均衡,为最终处理请求的服务器转发请求,比如nginx
代理ip分类(根据透明度进行分类):
透明代理:目标服务器能够查找到客户端ip地址,目标服务器收到的请求头如下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
匿名代理:服务器能感知到是通过代理进行转发,但是不知道客户端ip地址:
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Proxy IP
高级代理:服务器无法确定转发请求是否为代理(一般使用高级代理最好):
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
proxies = {
'http': 'http://12.34.56.79:9527',
'https':'https://12.34.56.79:9527'
}
response = requests.get(url,proxies=proxies)
协议有三种,http、https(主要用这两种)以及socks
免费代理ip:国内高匿免费HTTP代理IP - 快代理(但是容易出现很多ip代理已经挂掉)
10)使用verify参数忽略CA证书(因为存在CA证书过期/不合法的网站,一般人工访问会出现信任安全的弹框界面)
response = requests.get(url,verify=False) ##忽略CA证书认证
6、Request模块 —— post()
模拟金山词霸爬虫案例:百度翻译post爬虫案例_m0_59091819的博客-CSDN博客
7、session:相比与cookie,自动保持cookie,保持状态(场景:连续登陆,比如登陆之后再分其他页面)
session = requests.session() #创建实例化
response = session.get(url,headers,...)
response = session.post(url,headers,...)
模拟登录github案例: