requests模块的使用
写在前面的话:
在学习爬虫入门时,会常用到requests模块,熟悉这个模块的使用需要熟悉http,https ,及浏览器的请求原理。初次接触爬虫时了解下,掌握浏览器的请求过程和爬虫的本质,学起来就轻松多啦。
什么时候用get / post ?
# get response = requests.get(url, headers=headers) # get 带参数 requests.get(url, params=kw , headers=headers) # post response = requests.post(url, data=data, headers=headers)
# get 请求放在请求头里,有请求头 请求行 没请求体
# post 请求头 请求行 请求体
一、requests模块发送简单的请求、获取响应
需求:通过requests向百度首页发送请求,获取百度首页的数据
response = requests.get(url)
response的常用属性:
-
response.text ----获取响应体的二进制内容编码后的内容 即str
-
respones.content ----获取响应体的二进制内容,即bytes (二进制字节字符串)
-
response.status_code
-
response.request.headers ----根据响应获取请求的headers
-
response.headers ----响应的headers
-
response.url ------响应的url
-
response.request.url ------根据响应获取请求的url
注意:response.text 和response.content的区别
-
response.text
-
类型:str
-
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码;可能出现乱码情况
-
如何修改编码方式:指定 response.encoding=”utf-8”
-
或
-
指定 response.encoding='gbk' (ubuntu环境下的linux系统)
-
response.content
-
类型:bytes (二进制字节字符串)
-
解码类型: 没有指定
-
如何修改编码方式:response.content.deocde(“utf8”) 默认utf-8
使用requests模块发送带headers的请求 ***
headers形式的字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
为什么请求时要带上header?
模拟用户操作,迷惑浏览器
用法
requests.get(url,headers=headers)
使用requests模块发送带参数的请求 ****
参数的形式:字典
kw = {'wd':'长城'}
用法
requests.get(url,params=kw)
代理:
如果使用HTTPS代理 参数记得加上verify=False,因为https是一种加密传输、身份认证的网络协议
verify=False 表示对证书的有效性不作验证
二 、requests模块处理(携带)cookie请求的3种方式
第1种:使用session类
-
requests 提供了一个叫做session类,来实现客户端和服务端的会话保持
-
会话保持有两个内涵:
- 保存cookie 在session中
- 实现和服务端的长连接
-
使用方法:
# 创建 session实例 # get请求 session = requests.session() response = session.get(url,headers) # post请求 session = requests.session() response = session.post(post_url, data=post_data , headers=headers)
session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
第2种:把cookie放在headers中
注意:cookie有过期时间
在这个位置放置的cookie以键值对的形式,以 ;加一个空格 隔开
第3种 :使用cookies参数有2种方式
3.1 第一种
- cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}
- 使用方法:
- 把cookie字典交给cookies 来处理
requests.get(url,headers=headers,cookies=cookie_dict}
字典推导式
>>> {i:i+10 for i in range(10)} {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19} >>> {i:i+10 for i in range(10) if i%2 == 0} {0: 10, 2: 12, 4: 14, 6: 16, 8: 18}
# 准备cookie形式的字典 # cookie_dict = { i for i in cookie.spilt("; " )} cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")} response = requests.get(url, headers=headers, cookies=cookie_dict)
3.2 第二种 requests.utils.dict_from_cookiejar:把cookiejar对象转化为字典
# coding="utf-8" import requests url = "http://www.baidu.com" response = requests.get(url) print(type(response.cookies)) ---输出结果如下: ---<class 'requests.cookies.RequestsCookieJar'> # 把cookiejar对象转化为字典 cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies) ---输出结果如下: ---{'BDORZ': '27315'}
超时参数的使用
第1种方式:timeout
response = requests.get(url,timeout=3)
第二种方式:retrying 模块的使用 ----比timeout更好用,在代码中可以实现刷新
from retrying import retry @retry(stop_max_attempt_number=3) # 最大尝试连接次数 def _parse_url(url): """加上一个下划线表示该方法仅能在当前模块内使用""" # print("-----------") response = requests.get(url, headers=headers, timeout=3) assert response.status_code == 200 return response
感受成长的力量