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
posted @ 2019-06-16 10:51  心存温柔安静生长  阅读(866)  评论(0编辑  收藏  举报