python-request(基本用法)

之前学过urllib,但在实现功能时有些比较复杂,比如处理网页验证的cookies时,需要写opener和handle来处理。为了更加方便的实现这些操作,这就有了更为强大的库request,有了它,cookies、登录验证、代理设置等操作都不是事。

加载库:

import requests

1.实现get请求(还有其他参数后面介绍)

r = requests.get('http://baidu.com')

1.1 实例化对象r的一些方法:

type(r)         # 实例化对象的类型:requests.models.Response
r.status_code    # 状态码
type(r.text)     # 响应体为str格式(有时是JSON格式,JSON = str(字典)则需要用json()方法转换为字典)
r.text           # 响应体(返回的网页,后续提取网页信息)
r.cookies        # 得到cookies
r.headers        # 获取响应头
r.url            # 获取URL
r.history

1.2 除了get请求外,类似的实现其他请求(还有其他参数后面介绍)

r = requests.post('http://httpbin.org/post')
r = requests.put('http://httpbin.org/put')
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

1.3 在get请求中加入一些参数(等于加在网址上)

data = {
    'name':'daguo',
    'age':'23'
}   # 添加get信息,相当于在url后附加:http://httpbin.org/get?age=22&name=daguo

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}   # 添加请求头
r = requests.get('http://httpbin.org/get',params=data, headers = headers)   # params:参数

2. 抓取二进制文件并保存(下载:图片、音乐、电影)

r = requests.get('https://github.com/favicon.ico')  # 获取二进制文件的链接
with open('favicon.ico','wb') as f: # 新建文件二进制写入
    f.write(r.content)
    # 这里用r.content:为r中包含的原始内容(此处为二进制格式,直接写入即可)
    # 不用r.text:因为text将r中内容转换为了字符串格式(r.text = str(r.content))

3. POST请求

r = requests.post('http://httpbin.org/post')

3.1 提交表单

data = {
    'name':'daguo',
    'age':'23'
}   # 添加表单
# GET请求中的data是添加参数(args),相当于修改URL,params = data
# POST请求中的data是添加表单(form),能提供更多信息,data = data
r = requests.post('http://httpbin.org/get',data = data)

3.2 文件上传

files = {'file':open('favicon.ico','rb')}   # 以字典的形式上传文件
r = requests.post('http://httpbin.org/post',files = files)

3.3 获取和设置cookies(可以直接通过请求头设置)

# 获取cookies
r = requests.get('http://www.baidu.com')
print(r.cookies)    # 获取
# cookies里面都是一个个键值对,为方便咱看:
# 用item()将cookies装化成元组组成的列表
for key,value in r.cookies.items(): 
    print(key + '=' + value)
    
# 设置cookies
headers = {
    'Cookie':'从浏览器复制的已登录的Cookies',
    'Host':'www.zhihu.com',
    'User-Agent':'从浏览器复制下来'
}   # 通过请求头设置Cookies
r = requests.get('https://www.zhihu.com',headers=headers)

3.4 保持会话(Session)
使会话保持连续,即cookies动态变化,不需要手动操控

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
# 运行结果
{
    'cookies':{
        'number':123456789
    }
}

SSL证书验证

有的网站需要验证证书,没证书不让访问
通过verify强制让网站不验证
verify = True(验证)
verify = False(验证)

r = requests.get('https://www.12306.cn',varify = False)

虽然不验证但是有个警告建议验证

解决方案有三种:1.忽略警告;2.捕获警告到日志;3.指定本地证书进行验证

1.忽略警告

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
r = requests.get('https://www.12306.cn',varify = False)

2.捕获警告到日志

import logging
import requests
logging.captureWarnings(True)
r = requests.get('https://www.12306.cn',varify = False)

3.指定本地证书进行验证
本地需要有crt和key(解密状态)

import requests

r = requests.get('https://www.12306.cn',cert = ('/path/server.crt','/path/key'))

代理设置
普通代理proxies

proxies = {
    'http':'http://10.10.1.10:3128'
    'https':'http://10.10.1.10.1080'
}
r = requests.get('https://www.taobao.com',proxies = proxies)

需要使用HTTP Basic Auth 的代理
代理格式:http://user:password@host:port

proxies = {
    'http':'http://user:[email protected]:3128'
    'https':'http://user:[email protected]'
}
r = requests.get('https://www.taobao.com',proxies = proxies)

SOCKS协议的代理(需要安装:request[socks])

proxies = {
    'http':'socks5://user:[email protected]:3128'
}
r = requests.get('https://www.taobao.com',proxies = proxies)

超时设置

import requests
# 默认timeout = None:永久等待

r = requests.get('http://www.taobao.com',timeout = 1)

身份认证(账号密码)

import requests
r = requests.get('http://localhost:5000',auth = ('username','password'))

Prepared Request

通过Request对象来设置所有参数(建议使用)

from requests import Request, Session

url = 'http://httpbin.org/post'
data = {
    'name':'daguo'
}
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}   # 添加请求头
s = Session()
req = Request('POST',url, data=data, headers=headers)   # 用参数构造Request对象
preppd = s.prepare_request(req)     # 将Request对象转换为Prepared Request对象
r = s.send(preppd)                  # 将Prepared Request对象发送给r
print(r.text)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章