HTTP协议之请求
浏览器使用chrome,打开网页后打开调试,在 Network 中找到 Type=document 的请求(一般是第一条),就是请求的网站URL,点开后,Header->Request Headers 下的
-1.请求行
-2.请求头
Host 为请求的域名
User-Agent 为用户代理(身份标识)不同平台下不同版本浏览器都会有个不同的User-Agent,服务器通过User-Agent会知道请求的设备及浏览器,爬虫开发要模拟这个属性
Cookie:用来储存用户信息,服务器可能会根据请求是否携带cookie来判断是正常访问还是爬虫,以及要登陆的网站需要cookie,所以爬虫要携带cookie
Connection:keep-alive 支持长链接
Upgrade-Insecure-Requests:1 把不安全的请求转成安全请求(http->https)
-3.请求体
携带数据
GET请求没有请求体
POST请求有请求体
HTTP协议之响应
-1.响应头:
Set-Cookie:对方服务器通过该字段设置cookie到本地
-2.响应体:
URL地址对应的响应
requests模块学习
-1.安装:sudo pip3 install requests
-2.发送get、post请求,获取响应
import requests
# get请求
url = "http://www.baidu.com"
response = requests.get(url)
print(response)
# post请求
url = "http://www.baidu.com"
response = requests.post(url, data={请求体字典})
print(response)
-3.response的方法
import requests
# get请求
...
# post请求
...
# 通过此方法获得网页源码
print(response.content.decode())
# 或
response.encoding = "utf-8" # 指定编码
print(response.text)
response.request.url # 发送请求的url地址
response.url # response响应的url地址
response.request.headers # 请求头
response.headers # 响应请求
不一定每次都能获取到网页源码,这时候就要考虑修改编码格式
...
# 默认是utf-8
print(response.content.decode())
# utf-8获取不到修改为gbk
print(response.content.decode("gbk"))
# 上面2种都获取不到则使用text
print(response.text)
发送带headers的请求
...
# 一般带着user-agent就可以,不行的话带上除了cookie之外的其他参数,再不行全带上
header_dict = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.8 Safari/537.36"}
response = requests.post(url, data={请求体字典}, headers=header_dict)
-4.超时参数
response = requests.post(url, data={请求体字典}, headers=header_dict, timeout=3) # 超时时间为3s,超过3s会报错
-5.retrying模块学习
安装:sudo pip3 install retrying
使用retry模块:form retrying import retry
form retrying import retry
header_dict = {...}
# 如果函数报错的话会反复执行3次,期间没报错则继续执行后面的函数,如果全都报错整个程序才会报错
@retry(stop_max_attempt_number=3)
def _parse_url(url):
response = requests.get(url, headers=header_dict, timeout=5)
return response.content.decode()
def parse_url(url):
try:
htm_str = _parse_url(url)
except:
htm_str = None
return htm_str
-6.处理cookie相关的请求
1)、cookie存放到headers中
...
header_dict = {"user-agent": "...", "cookie": "cookie 字符串"}
response = requests.post(url, data={请求体字典}, headers=header_dict)
2)、cookie字典传给cookie参数
...
header_dict = {"user-agent": "..."}
# 如果从浏览器中复制的cookie字符串要转成字典,可以使用下面的方式
"""
cookie_str = "param1=参数1; param2=参数2; param3=参数3"
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
"""
cookie_dict = {...}
response = requests.get(url, cookies=cookie_dict)
实际操作方法:先发送post请求,获取cookie,带上cookie请求登陆后的页面
1)、session = requests.session() # 实例化session,session具有的方法和requests一样
2)、session.post(url, data, headers) # 服务器设置在本地的cookie会保存在session中
3)、session.get(url) # 会带上之前保存在session中的cookie,能够请求成功
关于Chorme中network记录跳转页面会刷新清除的问题,可以勾选上 Preserve log 这样跳转页面后就不会清除掉记录了