requests库相比urllib库来说确实方便太多了,果然:“人生苦短,我用python”

安装:pip install requests
中文文档:http://docs.python-requests.org/zh_CN/latest/index.html
Github地址:https://github.com/requests/requests

发送GET请求

1、最简单的get请求,通过requests.get来调用

response = requests.get("http://www.baidu.com/")

2、添加headers和查询参数

如果想添加headers,可以传入headers参数来增加请求头中的信息。如果要将参数放在url中传递,可以使用params参数,示例代码:

 import requests

 kw = {'wd':'中国'}  #查询关键字

headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}

 # params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
 response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)

 # 查看响应内容,response.text 返回的是Unicode格式的数据
 print(response.text)

 # 查看响应内容,response.content返回的字节流数据
 print(response.content)

 # 查看完整url地址
 print(response.url)

 # 查看响应头部字符编码
 print(response.encoding)

 # 查看响应码
 print(response.status_code)

response.content和response.text的区别:

1、response.content:这个是直接从网络上抓取的数据,没有经过任何解码,所以是一个bytes类型的数据,在硬盘和网络上传输的字符串都是bytes类型。

2、response.text:这个是requests将response.content进行解码的字符串,解码需要指定一个编码方式,requests会根据自己的猜测判断编码的方式,所有有时候会出现问题,解决方法:response.content.decode('utf-8')

发送POST请求

1、最基本的post请求可以使用post方法:

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

2、传入data数据

这个时候就不需要使用urlencode来进行编码了,可以直接传一个字典进去,比如请求拉勾网的数据的代码:

 import requests

 url = "https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false&isSchoolJob=0"

 headers = {
   'User_Agent' : 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
     'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
 }

 data = {
     'first': 'true',
     'pn': 1,
     'kd': 'python'
 }

 resp = requests.post(url,headers=headers,data=data)
 # 如果是json数据,直接可以调用json方法
 print(resp.json())

使用代理

使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递proxies参数就可以了。示例代码如下:

import requests

url = "http://httpbin.org/get"  #需要的目标url

headers = {
 'User_Agent' : 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}

proxy = {
    'http': '171.14.209.180:27829' #自己找的代理ip
}

resp = requests.get(url, headers=headers, proxies=proxy)
with open('xx.html','w',encoding='utf-8') as fp:
    fp.write(resp.text)

cookie

如果在一个响应中包含了cookie,那么可以利用cookies属性拿到这个返回的cookie值:

import requests

url = ""
data = {}
resp = requests.get('http://www.baidu.com/')
print(resp.cookies)  
print(resp.cookies.get_dict())

session

这个session并不是网站开发里面的那个session,之前使用urllib库,是可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用request,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象,示例代码如下:

import requests

url = ""
data = {}
headers = {
 'User_Agent' : 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}

# 登录
session = requests.session()
session.post(url,data=data,headers=headers)

# 访问
resp = session.get('')
print(resp.text)

处理不信任的SSL证书

对于那些已经被信任的SSL整数的网站,比如https://www.baidu.com/,那么使用requests直接就可以正常的返回响应。示例代码如下:

resp = requests.get(某url, verify=False)
print(resp.content.decode('utf-8'))

立志成为一名攻城狮