我们在上篇文章中已经说了如何请求服务器数据,我们接下来说说如何上传数据,上传数据主要依靠 POST 请求,当然 GET 也可以上传少量的数据,我们之前已经提到过我么就不再说了。
我们还是最好先配置一个简单的 '服务器' ,便于学习,简要的过程在https://www.jianshu.com/p/1568f539ed50
提到过,如果对 Flask 或者 其他 web 框架不熟悉的话,可以使用 https://httpbin.org
, 这个网站可以进行爬虫的测试。
1. 发送 POST 请求(data 参数)
发送 POST 请求需要使用方法response = requests.post(url) 或者 response = requests('post', url)
,需要上传的数据写成字典传递给参数 data,这与 get 中的不同,get 中接收数据的参数是 params 。
我们还是直接看一个实例。
服务器端添加代码:
@app.route('/post', methods=['POST'])
def getdata():
username = request.form['name']
userage = request.form['age']
print(request.headers)
return '你好!{}岁的{}!'.format(userage, username)
'''
运行结果:
127.0.0.1 - - [15/Aug/2019 07:20:28] "POST /post HTTP/1.1" 200 -
Host: 127.0.0.1:5000
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 20
Content-Type: application/x-www-form-urlencoded
'''
客户端:
data = {
"name":"zhangsan",
"age":20
}
r = requests.post('http://127.0.0.1:5000/post', data=data)
print(r.text)
# 你好!20岁的zhangsan!
2. 上传文件(file 参数)
POST 一般用于密码等安全性要求高的场合,提交数据量较大的场合,如上传文件,发布文章等。上传文章的功能是通过 file 参数实现的。例如在服务器端添加代码:
@app.route('/file', methods=['POST'])
def file():
f = request.files['file']
dir = os.path.abspath(os.path.dirname(__name__))
f.save(os.path.join(dir, f.filename))
return '文件已经成功保存!'+ os.path.join(dir,f.filename)
'''
运行结果为:
127.0.0.1 - - [15/Aug/2019 11:31:29] "POST /file HTTP/1.1" 200 -
'''
客户端:
files = {'file':open('o_180.jpg', 'rb')}
r = requests.post('http://127.0.0.1:5000/file', files=files)
print(r.text)
# 文件已经成功保存!D:\python-env\read_info\o_180.jpg
我们可以在服务器的目录找到这个文件。
3. cookie 和 session
本质上都是基于键值对的字符串,他们主要是记录访问者的一些基本信息,有时候我们访问一些以前访问过的网页,就会发现网页上显示:你好,XXX,这就是通过访问主机中的 cookies 文件实现的。
两者区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗(使用用户的cookies获取相关
信息 - session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
利弊:
- 带上cookie、session的好处:很多网站必须登录之后(或者获取某种权限之后)才能能够请求到相关数据
- 带上cookie、session的弊端:一套cookie和session往往和一个用户对应.请求太快,请求次数太多,
容易被服务器识别为爬虫。从而使账号受到损害 - 使用建议
1.不需要cookie的时候尽量不去使用cookie
2.为了获取登录之后的页面,我们必须发送带有cookies的请求,此时为了确保账号安全应该尽量降低数据采集速度
使用cookie进行模拟登录
1、首先使用浏览器登录网站
2、获取cookie信息
3、保存cookie信息放到请求头中
下面我们就使用 cookies 来获取登录之后人人网的响应:http://www.renren.com
首先我们先登陆查找 cookie 信息
url = 'http://www.renren.com/971209342/profile'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Cookie': 'anonymid=jzc5ghunttlk1b; depovince=ZGQT; jebecookies=f3d743af-119e-41cf-94b1-44d1d21d70d9|||||; _r01_=1; JSESSIONID=abc837cOVWaPY8EnyAtYw; ick_login=6bc88ad9-a441-4d80-9587-3c7f16d8b3a4; _de=D7EB52FD883E1C307714C84E6B3A67E9; p=101e5c01bbb3fdb458c8a4d70568990f5; first_login_flag=1; ln_uact=18918399717; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=0a2357a8d29747d884c92bc2fbdcec595; societyguester=0a2357a8d29747d884c92bc2fbdcec595; id=971909785; xnsid=6c963a2d; loginfrom=syshome'
}
response = requests.get(url, headers=headers)
print(response.text)
最后返回的结果就是我们登陆之后页面的 HTML 代码。
如果一个响应中包含了 cookie 那么我们可以利用 cookie参数拿到。
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
response = requests.get(url, headers = headers)
# 获取 cookie 信息
print(response.cookies)
# <RequestsCookieJar[<Cookie H_PS_PSSID=26523_1465_21108_29523_29518_29098_29568_28838_29221_22159 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=0 for www.baidu.com/>, <Cookie BD_HOME=0 for www.baidu.com/>]>
# 将 cookie 转化字典
content = requests.utils.dict_from_cookiejar(response.cookies)
print(content)
# {'H_PS_PSSID': '26523_1465_21108_29523_29518_29098_29568_28838_29221_22159', 'delPer': '0', 'BDSVRTM': '0', 'BD_HOME': '0'}
# 将 cookie 字典转化为对象
c = requests.utils.cookiejar_from_dict(content)
print(c)
# <RequestsCookieJar[<Cookie BDSVRTM=0 for />, <Cookie BD_HOME=0 for />, <Cookie H_PS_PSSID=26523_1465_21108_29523_29518_29098_29568_28838_29221_22159 for />, <Cookie delPer=0 for />]>
requests 中的 session 对象
在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie。
同样还是以人人网的登陆为例,这次我们使用 session 而不是手动的获取 cookies 。
首先我们需要找到接口的网址,
login_url = 'http://www.renren.com/PLogin.do'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
# 构造 session 会话对象
session = requests.session()
# 构造 POST 请求 data 数据
login_data = {
'email':'18918399717',
'password':'WAHHM64234979'
}
# 发送 POST 请求
r = session.post(login_url, data=login_data, headers=headers)
print(r.text)
# 验证登陆是否成功
r = session.get('http://www.renren.com/971909785/profile')
print(r.text)
最后返回的结果是登陆后界面的 HTML 代码。
网友评论