http协议
- http超文本传输协议,通俗讲就是浏览器与web服务器传输数据格式的协议,http协议是一个应用层的协议
- http协议是基于Tcp/IP协议,发送数据之前需要建立好连接
网络传输Tcp/IP四层模型
- 应用层
- 负责处理特定的应用程序细节.
- 传输层
- 主要为两台主机上的应用提供端到端的通信.
- 网络层
- 处理分组在网络中的活动,比如分组的选路.
- 网络接口层
- 包括操作系统中的设备驱动程序、计算机中对应的网络接口卡.
http请求过程
-
浏览器在拿到域名对应的ip后,先向地址栏中的url发起请求,并获取响应
-
在返回的响应内容(html)中,会带有css,js,图片等url 地址,以及ajax代码,浏览器按照响应内容中的顺序依次发出其它的相应请求,并获取相应
-
浏览器每获取一个响应就对展示出的结果进行添加(加载), js,css 等内容会修改页面的内容,js也可以重新发送请求,获取响应
-
从获取第一个响应并在浏览器中展示,直到最终获取全部响应,并在展示的结果中添加内容或修改————这个过程叫做浏览器的渲染
注意
- 在爬虫中,爬虫只会请求url地址,对应的拿到url地址对应的响应
- 浏览器渲染出来的页面和爬虫请求的页面很多时候并不一样,是因为爬虫不具备渲染的能力
- 浏览器最终展示的结果是由多个url地址分别发送的多次请求对应的多次响应共同渲染的结果
- 以在爬虫中,需要以发送请求的一个url地址对应的响应为准来进行数据的提取
requests模块
-
requests模块介绍
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
-
requests模块作用
- 发送http请求,获取响应数据
-
安装pythonjar包
pip install requests
-
request模块发送get请求
-
# 1.2.1-简单的代码实现 import requests # 目标url url = 'https://www.baidu.com' # 向目标url发送get请求 response = requests.get(url) # 打印响应内容 response.encoding = 'utf8' print(response.text)
-
常用方法
print(response.content.decode())
-
Requests.txt与Requests.content区别
- Requests.txt
- 类型:str
- 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
- Requests.content
- 类型:bytes
- 解码类型:无
- Requests.txt
-
通过对response.content进行decode,来解决中文乱码
response.content.decode()
默认utf-8response.content.decode("GBK")
- 常见的编码字符集
- utf8
- gbk
- gb2312
- ascii
- iso-8859-1
-
response响应对象的其它常用属性或方法
response.url
响应的url;有时候响应的url和请求的url并不一致response.status_code
响应状态码response.request.headers
响应对应的请求头response.headers
响应头response.request._cookies
响应对应请求的cookie;返回cookieJar类型response.cookies
响应的cookie(经过了set-cookie动作;返回cookieJar类型response.json()
自动将json字符串类型的响应内容转换为python对象(dict)
import requests #目标url url = 'http://www.baidu.com' response = requests.get(url) print(response.url) print(response.status_code) print(response.request.headers) print(response.headers) print(response.request._cookies) print(response.cookies)
-
发送带header的请求
import requests
url = 'http://www.baidu.com'
response = requests.get(url)
print(response.content.decode())
# 打印响应对应请求的请求头信息
print(response.request.headers)
import requests
url = 'https://github.com/JokerHai'
#构造请求字典
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
'Cookies':'浏览器cookie字符串'
}
# 请求头参数字典中携带cookie字符串
response = requests.get(url, headers=headers)
print(response.content.decode())
-
cookies参数的使用
cookies参数的形式:字典
cookies = {"cookie的name":"cookie的value"}
- 该字典对应请求头中Cookie字符串,以分号、空格分割每一对字典键值对
- 等号左边的是一个cookie的name,对应cookies字典的key
- 等号右边对应cookies字典的value
cookies参数的使用方法
response = requests.get(url, cookies)
将cookie字符串转换为cookies参数所需的字典:
cookies_dict = {cookie['name']:cookie['value'] for cookie in cookies_str.split('; ')}
注意:cookie一般是有过期时间的,一旦过期需要重新获取