requests库
1.requests库是用来发送http请求,接收http响应的一个python库
requests库经常被用来爬取网站信息
用它发起http请求到网站,从响应消息中提取信息
例:
pip install requests
import requests respone = requests.get('http://mirrors.sohu.com/') print(respone.text)
2.抓包工具fiddler
用于查看具体发送请求和接收响应信息
fiddler是代理抓包工具
fiddler启动后,会启动一个代理服务器(同时设置自己为系统代理)监听在8888端口上
浏览器可以用f12
3.抓包过滤
filter--show only the following hosts
例如:localhost;127.0.0.1;*.sohu.com
*作为通配符
4.在inspectors标签查看
上半部分发送请求信息
下半部分接收响应信息
raw标签:查看整个http具体内容
5.requests程序抓包
要让requests发送请求使用代理,只需要如下参数
import requests
proxies = {
'http':'http://127.0.0.1:8888',
'https':'http://127.0.1:8888'}
response = requests.get('http://mirrors.sohu.com/', proxies = proxies)
print(response.text)
注:如若抓https需要安装fiddler证书为受信任证书
6.手机抓包
前置条件:电脑和手机在同一WiFi下
fiddler-tools-options-connections-点击allow remov computers to connect
打开手机wifi,修改网络,高级设置,代理设置为手动,填入电脑ip(ipconfig)和端口8888
苹果手机类似
https需要先把证书导入手机
7.构建请求url----params
https://www.baidu.com/s?wd=iphone&rsv_spt=1
?wd=iphone&rsv_spt=1问号后面为url参数
把参数放在字典内
import requests
para={ ‘wd’ : 'iphone', 'rsv_spt' : '1' }
respone = requests.get('https://www.baidu.com/',params=para)
print(respone.text)
8.构建请求头----headers
import requests head={'user-agent' : 'my-app/0.0.1', 'auth-type' : 'jwt-token' } respone=requests.post("http://httpbin.org/post", headers=head) print(respone.text)
注:这里是post请求了
9.构建请求消息体----data
消息体基本都是文本,文本格式主要是三种:urlencoded,json,xml
(1)xml格式消息体
payload = ''' <?xml version="1.0" encoding="UTF-8"?> <WorkReport> <Overall>良好</Overall> <Progress>30%</Progress> <Problems>暂无</Problems> </WorkReport> '''
respone = requests.post('http://httpbin.org/post', data=payload.encode('utf8')) print(respone.text)
注:这里encode限定格式为utf8,如果没有默认为Latin-1
(2)urlencoded格式消息体
这种格式的消息体就是一种 键值对的格式存放数据,如下所示
key1=value1&key2=value2
Requests发送这样的数据,当然可以直接把这种格式的字符串传入到data参数里面。
但是,这样写的话,如果参数中本身就有特殊字符,比如等号,就会被看成参数的分隔符,就麻烦了。
我们还有更方便的方法:只需要将这些键值对的数据填入一个字典。
然后使用post方法的时候,指定参数 data 的值为这个字典就可以了,如下
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
(3)json格式----json
import requests,json
payload = { "Overall":"良好", "Progress":"30%", "Problems":[ { "No" : 1, "desc": "问题1...." }, { "No" : 2, "desc": "问题2...." }, ] } #可以使用json库的dumps方法 r = requests.post("http://httpbin.org/post", data=json.dumps(payload)) #抓包后消息体汉字全部为ascll码
r = requests.post("http://httpbin.org/post", data=json.dumps(payload,ensure_ascii=False).encode())
#也可以直接传递给post方法的 json参数 r = requests.post("http://httpbin.org/post", json=payload)
10.检查响应状态码----status_code
import requests r = requests.get('http://mirrors.sohu.com/') print(r.status_code)
11.检查响应消息头
import requests,pprint
r = requests.get('http://mirrors.sohu.com/')
print(type(r))
print(type(r.headers))
pprint.pprint(dict(r.headers))
print(dict(r.headers))
print(r.headers)
print(r.headers['Connection'])
print(dict(r.headers)['Connection'])
运行结果如下
<class 'requests.models.Response'> <class 'requests.structures.CaseInsensitiveDict'> {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Connection': 'keep-alive', 'Content-Length': '832', 'Content-Type': 'application/json', 'Date': 'Wed, 08 Mar 2023 02:12:37 GMT', 'Server': 'gunicorn/19.9.0'} {'Date': 'Wed, 08 Mar 2023 02:12:37 GMT', 'Content-Type': 'application/json', 'Content-Length': '832', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'} {'Date': 'Wed, 08 Mar 2023 02:12:37 GMT', 'Content-Type': 'application/json', 'Content-Length': '832', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'} keep-alive keep-alive
print(r.headers['Connection'])
print(dict(r.headers)['Connection'])提取字典一个元素值
r.headers对象类型继承自dict字典类型的一个类
子类继承父类,同字典一样操作
11.检查响应消息体
(1)获取响应消息体的文本内容,直接通过response对象的text属性可以获取
import requests respone = requests.get('http://mirrors.sohu.com/') print(respone.text)
(2)那么,requests是以什么编码格式把HTTP响应体的字节串解码成字符串呢?
requests会根据响应消息头(比如:"Content-Type": "application/json")
但有时候没有,需要我们指定方式
import requests response = requests.get('http://mirrors.sohu.com/') response.encoding='utf8' print(response.text)
(3)如果我们要直接获取消息体中的字节串内容,可以使用context属性
import requests response = requests.get('http://mirrors.sohu.com/') print(response.content)
得到的是b'<!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8.......字节串
当然,如果可以直接对 获取的字节串 bytes对象进行解码
print(response.content.decode('utf8'))
12.api响应的消息体格式以json居多
为了方便处理响应消息中的json格式数据,通常我们把json格式字符串转换成python中的数据对象
使用json数据库中的loads函数
import requests,json respone = requests.post("http://httpbin.org/post", data={1:1,2:2}) obj=json.loads(respone.content.decode('utf8'))
print(obj)
requests库为我们提供了更方便的方法,可以使用 Response对象的 json方法,
如下:
response = requests.post("http://httpbin.org/post", data={1:1,2:2}) obj = response.json() print(obj)
声明:参考requests库 和 session | 白月黑羽 (byhy.net),仅用于自学使用