requests使用入门

问题:为什么要学习requests,而不是urllib?

  1. requests的底层实现就是urllib
  2. requests在python2和python3中通用,方法完全一样
  3. requests简单易用
  4. 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 的形式:字典

使用代理

  1. 用法:requests.get("http://www.baidu.com", proxies=proxies)
    proxies的形式:字典
proxies = {
    "http": "http://12.34.56.79:9527",
    "https": "https://12.34.56.79:9527"
}
  1. 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类,来实现客户端和服务端的会话保持
使用方法:

  1. 实例化一个session对象
  2. 让session发送get或者post请求
    session = requests.session()
    response = session.get(url, headers)