两个主要的函数:
get
post
import requests
kwd = "吴秀波出轨门"
# URL编码
from urllib.parse import urlencode
res = urlencode({"wd":kwd})
print(res)
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
url = "https://www.baidu.com/s"
#直接将参数放在 params中 会自动进行url编码
response = requests.get(url,headers=headers,params={"wd":kwd})
print(response.status_code)
print(response.text)
添加数据到请求头中
response = requests.get(url,headers={
# 把你的数据加在这里
},params={"wd":kwd})
print(response.status_code)
print(response.text)
post请求参数
其他参数与get一致,请求体放在data中
requests.post(data={})
返回值的处理
response = requests.get(url,headers=headers,params={"wd":kwd})
print(response.status_code) # 状态码
print(response.text) # 将结果以文本的形式返回
res1=response.content # 将结果以二进制的方式返回
res2=response.json() # 将数据直接反序列化得到字典或是列表
requests模块的其它用法
session可以帮助我们自定完成cookie的存储和发送
import requests # 创建一个session对象 session = requests.session()
1.请求登录页面
res = session.get("https://github.com/login",headers={
"Referer": "https://github.com/",
"User-Agent": user_agent
})
print(res.status_code)
token = re.search('name="authenticity_token" value="(.*?)"',res.text).group(1)
print(token)
2.发送登录请求,带上cookie,带上请求体
res2 = session.post("https://github.com/session",
headers = {
"Referer": "https://github.com/login",
"User-Agent": user_agent},
data={
"commit": "Sign in",
"utf8": "✓",
"authenticity_token": token,
"login": "oldboyedujerry",
"password": "123654asdAsd"},
allow_redirects = False
)
print(res2.status_code)
访问个人主页
res3 = session.get("https://github.com/settings/profile",
headers={
"User-Agent": user_agent,
"Referer": "https://github.com/login"
})
print(res3.status_code)
with open("tt.html","wt") as f:
f.write(res3.text)
# 判断是否登录成功
print("oldboyedujerry" in res3.text)
""
session可以帮助我们自定完成cookie的存储和发送
"""
import requests
# 创建一个session对象
session = requests.session()
"""
1.请求登陆页面 获取token cookie
2.发生登陆的post请求,将用户名密码 和token 放在请求体中,cookie放在请求头中
"""
import requests
import re
login_url = "https://github.com/login"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
res1 = session.get(login_url,headers=headers)
print(res1.status_code)
# 从响应体中获取token
token = re.search('name="authenticity_token" value="(.*?)"',res1.text).group(1)
print(token)
# 保存cookie
# login_cookie = res1.cookies.get_dict()
# print(login_cookie)
# 发送登陆请求
res2 = session.post("https://github.com/session",
headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"},
data={
"commit": "Sign in",
"utf8": "✓",
"authenticity_token": token,
"login": "yangyuanhu",
"password": "123654asd"},
# 是否允许自动重定向
allow_redirects = False)
print(res2.status_code)
# 用户登录成功后的cookie
# user_cookie = res2.cookies.get_dict()
# 访问主页
res3 = session.get("https://github.com/settings/profile",headers = headers)
print(res3.status_code)
print(res3.text)
# "https://github.com/settings/profile"
response属性
import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
print(respone.text) # 获取解码后的内容 html
print(respone.content) # 获取二进制字节数据
print(respone.json()) # 对响应进行json反序列化,仅在返回的数据为json格式时可使用
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.url)
print(respone.history) # 获取重定向历史
print(respone.encoding) # 响应体编码方式
关闭:上下文管理
# 可以以生成器的方式来获取 在数据较大时 可以避免内存溢出
print(res.iter_content())
from contextlib import closing
with closing(requests.get('http://www.autohome.com/news',stream=True)) as response:
for line in response.iter_content(chunk_size=10):
print(line)
print(len(line))
指定响应体编码
import requests
response=requests.get('http://www.autohome.com/news')
response.encoding = "GBK" 指定响应体编码
print(response.text)
print(response.encoding)
分段获取数据
# 当响应体数据太大的时候一次性获取所有可能造成内存溢出
# 可以使用iter_content 分段获取数据,
# chunk_size 指定每次获取的长度,
# decode_unicode 是否进行解码 通常为false
import requests
respone = requests.get("https://www.qq.com")
with open("tt.html","wb") as f:
for i in respone.iter_content(chunk_size=1024,decode_unicode=False):
print(len(i))
f.write(i)
获取原始套接字响应数据
r = requests.get('https://api.github.com/events', stream=True)
# <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
print(r.raw.read(10))
SSL Cert Verification——证书验证(大部分网站都是https)
#证书验证(大部分网站都是https)
import requests
respone=requests.get('https://www.12306.cn') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
#改进1:去掉报错,但是会报警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
使用代理
官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies
代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
ips = ["http://180.118.73.147:9000","http://180.118.73.147:9000"]
proxies={
# 'http':'http://180.118.73.147:9000',#带用户名密码的代理,@符号前是用户名与密码
'http':'http://180.118.73.147:9000',
}
respone=requests.get('https://www.baidu.com',roxies=proxies)
print(respone.status_code)
支持socks代理,安装:pip install requests[socks] import requests proxies = { 'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port' } respone=requests.get('https://www.12306.cn', proxies=proxies) print(respone.status_code)
超时设置
#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间
import requests
respone=requests.get('https://www.baidu.com',
timeout=0.0001)
捕获异常
#异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
# except ConnectionError: # 链接失败
# print('-----')
# except Timeout: # 超时
# print('aaaaa')
except RequestException as e: # 其他异常
print(e)
上传文件
import requests files={'file':open('a.jpg','rb')} # value为文件对象 respone=requests.post('http://httpbin.org/post',files=files) print(respone.status_code)
