爬虫 - 上传服务器数据

2019-08-15  本文已影响0人  Vector_Wan

我们在上篇文章中已经说了如何请求服务器数据,我们接下来说说如何上传数据,上传数据主要依靠 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进行模拟登录
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 代码。

上一篇下一篇

猜你喜欢

热点阅读