欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

requests库的使用

程序员文章站 2024-03-23 09:02:16
...

Requests库

​ requests库底层实现是有urllib

​ requests在python2和python3中通用

​ 其作用是发送网络请求,返回响应数据

​ 中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html

如何发送请求

response=requests.get(url)

  • 生成一个请求需要哪些数据?

    ​ 请求方式:get\post

    ​ 请求的资源路径:url

    ​ 协议版本:HTTP/1.1 (HTTP/2.0在1.1版本的基础上增加了并发请求)

    ​ 请求参数

    ​ 请求头

获取响应

  • response.content如果得到bytes类型,则需要decode
  • response.text可以通过response.encoding()来指定解码方式

  • 响应对象中有什么?

    ​ 响应状态码:response.status_code 200 500 404

    ​ 响应消息头:response.headers set_cookie

    ​ 响应消息正文:

    ​ response.text

    ​ response.content

    ​ 发送的请求对象:

    ​ response.request

  • 判断响应是否成功

    assert response.status_code==200

response常用的方法

response.text 
respones.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 = {"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"} 

    用法是:requests.get(url,headers=headers)

发送带参数的请求

  • 参数形式:字典
  • 用法:`requests.get(url,headers=headers,parmas=dict)

发送post请求

​ 在登录注册和传输大文本内容的时候用到post请求

  • 用法

    response = requests.post("http://www.baidu.com/", data = data,headers=headers)

    data的形式:字典

用post请求百度翻译

import requests
import json


headers = {
"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"
}
query_string=input()
# query_string=sys.argv[1]
data = {
        "query": query_string,
}
post_url = "http://fanyi.baidu.com/basetrans"
url="http://fanyi.baidu.com/langdetect"
response=requests.post(url,data=data,headers=headers)
ret=response.content.decode() # ret 是一个字符串对象
ret=json.loads(ret)

print(ret)
if ret["lan"]=='en':
    # 输入是英文
    data = {
        "from": "en",
        "to": "zh",
        "query": query_string,
    }
    r = requests.post(post_url, data=data, headers=headers)
    dict_ret = json.loads(r.content.decode())
    ret = dict_ret["trans"][0]["dst"]
    print(ret)
elif ret["lan"]=='zh':
    # 输入是中文
    data = {
        "from": "zh",
        "to": "en",
        "query": query_string,
    }
    r = requests.post(post_url, data=data, headers=headers)
    dict_ret = json.loads(r.content.decode())
    ret = dict_ret["trans"][0]["dst"]
    print(ret)

代理的应用

  • 为什么使用代理
    • 让服务器以为不是同一个客户端在请求
    • 防止我们的真实地址被泄露,防止被追求
      requests库的使用

requests库的使用

  • 代理的使用

    • requests.get("http://www.baidu.com",proxies = proxies)

    • proxies形式:字典

    proxies = { 
        "http": "http://12.34.56.79:9527", 
        "https": "https://12.34.56.79:9527", 
        }

登录状态的保持

cookie和session的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
  • session会在一定时间内保存在服务器上,如果访问增多,会占用较多的服务器资源
  • 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie

爬虫中处理cookie和session

  • 带上cookie和session的好处

    ​ 能够请求到登录之后的页面

  • 带上cookie和session的弊端

    ​ 一套cookie和session对应一个用户,如果请求太多,容易被服务器判定爬虫

  • cookie能不用则不用,如果为了获取登录之后的页面,必须发送带有cookie的请求

保持登录状态

  • requests模块提供了一个session类,来实现客户端和服务端的会话保持

    • 方法:

    ​ 实例化session对象

    ​ 让session发送get或者post请求

    session=requests.session()
    response=session.get(url,headers)
  • 手动获取cookie,保存到文件或数据库中,在发送请求时,携带cookie

    • 把cookie写到headers中

    headers={"Cookie":cookie值}

    • 使用参数将cookie字典传入
    cookies={
        "username":"xxxxx",
        "key":"value"
    }
    requests.get/post(url,cookies=cookies)

requests 其他

  • 请求ssl证书验证

    response= requests.get("https://www.12306.cn/mormhweb/ ", verify=False)

  • 设置超时

    response=requests.get(url,1)

  • 配合状态码判断是否请求成功

    assert 断言

    assert response.status_code==200