requests使用入门
问题:为什么要学习requests,而不是urllib?
- requests的底层实现就是urllib
- requests在python2和python3中通用,方法完全一样
- requests简单易用
- requests能够自动帮助我们解压(gzip压缩的等)网页内容
requests的作用
作用:发送网络请求,返回响应数据
中文文档 API:http://docs.python-requests.org/zh_CN/latest/index.html
发送简单的请求
需求:通过requests向百度首页发送请求,获取百度首页的数据
response = request.get(url)
response的常用方法:
- response.text
- response.content
- response.status_code
- response.request.headers
- response.headers
response.text和response.content的区别
- response.text
- 类型:str
- 解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测文本编码
- 如何修改编码方式:response.encoding="gbk"
- response.content
- 类型:bytes
- 解码类型:没有指定
- 如果修改编码方式:response.content.decode("utf-8")
发送带header的请求
模拟浏览器,欺骗服务器,获取和浏览器一致的内容
- header的形式:字典
- headers=
- 用法:requests.get(url, headers=headers)
发送带参数的请求
什么叫做请求参数
例1:http://www.webkaka.com/tutorial/server/2015/021013/
例2:https://www.baidu.com/s?wd=python&c=b
- 参数的形式:字典
- kw =
- 用法:requests.get(url, params=kw)
发送POST请求
用法:
reponse = requests.post("http://www.baidu.com/", data=data, headers=headers)
data 的形式:字典
使用代理
- 用法:
requests.get("http://www.baidu.com", proxies=proxies)
proxies
的形式:字典
proxies = {
"http": "http://12.34.56.79:9527",
"https": "https://12.34.56.79:9527"
}
retrying
模块的使用
- 使用
retrying
模块提供的retry
模块 - 通过装饰器的方式使用,让被装饰的函数反复执行
- retry中可以传入参数
stop_max_attempt_number
,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行
示例代码:
import requests
from retrying import retry
headers = {}
@retry(stop_max_attempt_number=3) #最大重试3次,3次全部报错,才会报错
def _parse_url(url):
response = requests.get(url, headers=headers, timeout=3) # 超时的时候会报错并重试
assert response.status_code == 200 # 状态码不是200,也会报错并重试
return response
cookie和session的区别
- cookie数据存放在客户的浏览器上,session数据存放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
爬虫处理cookie和session
带上cookie、session的好处:
能够请求登录之后的页面
带上cookie、session的弊端:
一套cookie和session往往和一个用户对应请求太快,请求次数太多,容易被服务器识别为爬虫
不需要cookie的时候尽量不去使用cookie
但是为了获取登录之后的页面,我们必须发送带有cookies的请求
处理cookies、session请求
requests提供了一个叫做session类,来实现客户端和服务端的会话保持
使用方法:
- 实例化一个session对象
- 让session发送get或者post请求
session = requests.session()
response = session.get(url, headers)