美文网首页
爬虫 - 上传服务器数据

爬虫 - 上传服务器数据

作者: Vector_Wan | 来源:发表于2019-08-15 12:37 被阅读0次

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

相关文章

  • 爬虫 - 上传服务器数据

    我们在上篇文章中已经说了如何请求服务器数据,我们接下来说说如何上传数据,上传数据主要依靠 POST 请求,当然 G...

  • termux python环境

    第一次写了一个爬虫程序,主要是从ASPX页面获取数据,然后上传到我的服务器数据库。由于数据需要每天更新一次,随身携...

  • iOS Stream的使用

    当项目中需要上传大量数据至服务器的时候(例如拿到的蓝牙数据包实时上传),使用JSON上传会对服务器造成较大的压力,...

  • Robots 协议

    受限于编写水平和目的,网络爬虫将会为 web 服务器带来巨大的资源开销。服务器上的数据有产权归属,网络爬虫获取数据...

  • Android 模拟服务器请求数据

    Bmob 免费服务器,把数据上传,生成url链接 网盘,数据上传,生成URL链接 网络代理(charlse,fid...

  • 图片文件上传

    上传文件原理 上传文件,就是将文件从浏览器端传到服务器端; 上传文件,必须使用 标记来向服务器端发数据...

  • Java爬取豆瓣图书数据

    Java爬虫:豆瓣图书数据,已经上传了sql文件,只爬了3000+本书,15000+评论数据,数据库Mysql,主...

  • PHP文件上传

    1、文件上传原理 1)上传文件,就是将文件从浏览器端传到服务器端;2)上传文件,必须使用 标记来向服务器端发数据;...

  • 「Scrapy」爬虫状态反馈组件 v1.0.0

    爬虫服务在服务器上跑着,心里面难免会犯嘀咕,爬虫死掉了怎么办?爬虫漏了数据怎么办?爬虫被网站封禁了怎么办?目标网站...

  • 通过navicat将数据库传输到远程服务器

    使用Navicat for MySQL把本地数据库上传到服务器

网友评论

      本文标题:爬虫 - 上传服务器数据

      本文链接:https://www.haomeiwen.com/subject/tjfajctx.html