简介:
requests是一个优雅而简单的Python 第三方HTTP请求库,专为人类而构建。
requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档:http://cn.python-requests.org/zh_CN/latest/
英文文档:http://docs.python-requests.org/en/master/api/
安装:
pip install requests -i https://pypi.doubanio.com/simple
一、请求(requests)
每一个请求方法都有一个对应的API。比如GET请求就使用get()方法, 而POST请求就使用post()方法,并且将需要提交的数据传递给data参数即可
请求方法
-
get 获取页面数据
import requests
url = "https://www.baidu.com"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/73.0.3683.86 Safari/537.36",
"Referer":"https://www.baidu.com"
}
resp = requests.get(url, headers=headers)
-
post 提交数据到指定资源
url = "http://httpbin.org/post"
form_data = {
'username':'yelan',
'password':'xxxxxxx'
}
resp = requests.post(url=url, data=form_data)
-
其他的请求类型
resp = requests.put(url="http://httpbin.org/put", data=None) # 修改
resp = requests.delete("http://httpbin.org/delete") # 删除
resp = requests.head("http://httpbin.org/head") # 请求头部
resp = requests.options("http://httpbin.org/options") # 查看服务器性能
二、响应(response)
属性/方法 | 说明 |
---|---|
text属性 | 返回时的文本内容(html); 当然对返回的数据使用 resp.content.decode()就相当于resp.text |
content属性 | 返回的二进制的响应数据 |
json方法 | 对json数据转dict; 只有返回的数据是json是才可以使用 |
测试网站: http://httpbin.org/post | 返回的都是json数据 |
resp.encoding = 'utf-8' | 指定编码 |
status_code属性 | 响应状态码 |
headers属性 | 响应头部(字典) |
cookies属性 | 响应的set-cookies |
url 属性 | 访问的url |
history属性 | 返回响应的历史 [使用响应对象的 history 属性来追踪重定向] |
三、参数
urllib3.disable_warnings() # 禁用警告
参数 | 说明 |
---|---|
url | 请求的url |
params=None | get请求携带的参数, 一般用于查询或者搜索(返回的数据在args键中)。对于一键多值的key,而value用一个列表。 如:params = { 'name': 'yelan', 'hobby': ['django', 'play'] } |
data=None | post请求提交的数据(如表单) |
headers=None | 请求头部信息 |
json=None | 发送请求时携带json数据(返回的数据在键data中,当然也在json中) |
cookies=None | 请求携带的cookies;当然也可以把cookies更新到headers的头部信息;[Dict或CookieJar对象] |
allow_redirects=True | bool类型 请求是默认开启重定向的, False禁止重定向。[Enable启用/disable禁用] |
proxies=None | http代理, 是一个字典 [字典映射协议到代理的URL] |
verify=None | 请求时是否验证verify |
stream | stream=False 响应内容将立即下载 # stream=True将以流的形式下载 |
proxies # http代理, 是一个字典 [字典映射协议到代理的URL]
proxies = {
"http":"http://221.6.32.206:41816",
"https":"https://221.6.32.206:41816"
}
resp = requests.get('http://httpbin.org/ip', proxies=proxies)
verify # 请求时是否验证SSL证书;默认验证的,关闭verify=False即可
import urllib3
urllib3.disable_warnings() # 禁用警告信息
# 如果我们访问的目标网站,证书有问题,或者我们使用了代理服务的证书有问题,
# 在这种情况下,如果我们还是要对这些目标发送请求,那么我可以关闭requests的证书验证
resp = requests.get(url="http://www.12306.com", headers=headers, verify=False)
stream # stream=False 响应内容将立即下载 # stream=True将以流的形式下载
resp = requests('http://httpbin.org/bytes/102400', stream=True)
for chunk in resp.iter_conten(chunk_size=1024):
print(chunk)
with ...
files (文件上传)
files = {}
with open("favuicon.ico", "rb") as f:
files.update({"file": f.read()})
resp = requests.post("http://httpbin.org/post", files=files)
# 当然最好指定上传文件的content-type, 将其更新到headers中携带
allow_redirects=False # 关闭重定向
resp = requests.get('http://github.com', allow_redirects=False)
print(r.headers) # 该网址会重定向,关闭重定向后,无响应数据
auth (身份认证)
# 如果访问的网站,需要我们验证用户身份信息(如 用户名 密码) from request.auth import HTTPBasicAuth url = 'http://need authentication of url' resp = requests.get(url, auth=('username', 'password')) # 其实上面的auth参数是HTTPBasicAuth的实例,它会默认使用HTTPBasicAuth这个类来验证: requests.get(url, auth=HTTPBasicAuth('username', 'password'))
timeout (设置超时)
API
requests底层api接口 ==> request : def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None): pass
四、session 会话对象
session能够自动的整合每次请求返回的set-cookie, 并且在后续的请求中自动携带.
就是说你使用session对象来发送请求, 那么返回的set-cookie会自动保存和整合 并自动在后续请求中携带上. 就不用手动给后续请求设置cookies.
-
所有会话对象发出去的请求 会自动保持状态
-
对同一主机发送多个请求, 重用TCP连接
-
session 所有的api和requests都是一样的
-
Session 类中封装了requests所需的所有请求
【常用于模拟登录】
import requests url = 'http://httpbin.org/get' # 该测试网址返回的都是json数据 session = requests.Session() resp = session.get(url, headers=headers) print(resp.text) print(resp.json()) # 设置整个headers session.headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/73.0.3683.86 Safari/537.36" } # 如果需要添加或者更新headers referer = {'Referer': 'http://www.baidu.com'} session.headers.update(referer)
模拟豆瓣登录
import requests from Spiders_class.demo_03 import my_info as mb headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Referer": "https://accounts.douban.com/passport/login" } login_url = 'https://accounts.douban.com/j/mobile/login/basic' # 登录请求的url login_data={ "ck": "", "name": mb.user, "password": mb.pwd, "remember": "false", "ticket": "", } personal_url = 'https://www.douban.com/people/197134290/' # 用户个人中心 # session能够自动的整合每次请求返回的set-cookie, 并且在后续的请求中自动携带. session = requests.Session() session.headers = headers # 在会话时就携带头部信息(整个headers) resp = session.post(login_url, data=login_data) response = session.get(personal_url) response = 'utf-8' print(response.text)
开发流程:
1.找到目标数据(如需要请求的目标url)
2.分析请求流程(从目标页面分析、匹配到所有页面的url)
3.发起http请求(对所有的url发起请求;多线程)
4.提取清洗数据(re、xpath等以及其他模块的方法)
5.数据持久化(构造结构化数据、保存到文件或数据库)