requests 的一些高级用法,如文件上传、 Cookies设置 、 代理设置
1、 文件上传
我们知道 requests可以模拟提交一些数据。 假如有的网站需要上传文件,我们也可以用它来实现, 这非常简单,示例如下 :
import requests
files = {'file' : open('favicon.ico','rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)
2. Cookies
例如知乎网站不带cookie的爬取结果
import requests
r =requests.get("https://www.zhihu.com")
print(r.text)
输出:
有cookie的爬取结果
cookiede获取方法
利用cookie发起模拟请求:
import requests
import re
headers = {
'Cookie':'tgw_l7_route=116a747939468d99065d12a386ab1c5f; _zap=ac5fdb1f-8e53-4d69-a7f4-07a72df1caff; _xsrf=zKMRD5fn7u8DG1Ea6iO2L7PIWWRMnuiW; d_c0="ALDk6-gCAA-PTkVxRo8-KYq-C3MJO-hnkWI=|1550478800"; capsion_ticket="2|1:0|10:1550478875|14:capsion_ticket|44:N2RhNTdlNzUxODA2NGI4M2JiMWU5NmUzZWU0MTVmOTg=|2237d5a4349ae9b52dd4a26b835189f9b897eba8a64410dd7165b1cc5411f5f7"; z_c0="2|1:0|10:1550478919|4:z_c0|92:Mi4xdXpOYkRnQUFBQUFBSU9MZTZBSUFEeVlBQUFCZ0FsVk5SN3hYWFFEWURjb2xNZzdZTlFZRkdQa3luZFlzczl2bEdB|8c000aeb764ed6f142580cf5e7e3767c55b9c8e7b7c6def4d269a2694a4a6b03"; tst=r; q_c1=eb832fa18402482cafc7a8aa538bf33e|1550478920000|1550478920000',
'Host':'www.zhihu.com',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac 05 X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com",headers = headers)
print(r.text)
输出结果
首页 - 知乎
北京海淀区一女的:各位开店的大哥大姐们,谢谢你们瞧得起我,但我不接推广,也不会在这个文章下安插你的店铺,也不会帮您宣传代购店,所以不要在私信我了。妹子们,首先感谢你们的信任,但也别让我推荐了,因为我负不了这个责任,我只能告诉你们哪个假却无法告诉你们哪个卖的全部是真的,万一他真假混卖,卖我真的,发你假的,那我就把你害了。————————以下原文——————— 干货,避免踩雷。因为自己总回答美妆的问题,有一些学生党就…
打不死的小强:曾经我也是一个空有上进心的人,直到我学会了这个方法。我从一个空有上进心的人,变成了强力的执行者:在一年之内,坚持每天学习1个小时的专业知识,读1个小时的专业书籍,每周星期输出1~2篇原创内容(2000字以上),成为了平台签约作者,自己也成为公司的运营负责人。要想解行动力问题,首先要了解:为什么很多时候,我们会空有上进心?我想用自己的亲身经历告诉你:刚毕业的时候,我给自己立了一个目标:毕业5年内要实现年薪10…
Gamit God:一分钟:卧槽,这逼怎么这么丑?老娘当初怎么看上他的? 五分钟:这屌丝也还行,虽然不帅,但是还算顺眼。 十分钟:哎呀,怎么感觉越看越好看了呢(●◡●)ノ。哎呀他笑了,好温暖,好阳光。 二十分钟:hhh,老娘捡到宝了,虽然帅的很含蓄,但还是被我发现了!!! 半个小时:我男朋友最帅最可爱。不接受反驳,哪个女的敢多看他一看,老娘瞪死她。 一个小时: 这么好的男人,万一被别人惦记上咋么办?我得想个办法让他死心塌…
小枣君:大家好,我是小枣君。来迟了,抱歉。先放上一篇有史以来最强的5G科普: 一个简单且神奇的公式 今天的故事,从一个公式开始讲起。 这是一个既简单又神奇的公式。说它简单,是因为它一共只有3个字母。而说它神奇,是因为这个公式蕴含了博大精深的通信技术奥秘,这个星球上有无数的人都在为之魂牵梦绕。 这个公式,就是它—— 我相信很多同学都认出这个公式了,如果没认出来,而且你又是一个理科生的话,请记得有空多给你的中学物理…
东方朔:给新人的建议:活儿是干不完的。给中层的建议:人心,核心业务,领导关系,起码拿一个。给高层的建议:下面人永远看你是傻逼,多做多错。给新人:你如果要拼,在这我很鼓励,您可以直接划下去看给中层和高层的建议。我是想对这样的人说:初入职场,我希望好好工作,我也很担心被公司剥削,我不想着一步登天,但我就想慢慢混着,一点一点混到一个不错的位置和高度。我不是工作狂,工作只是我生命的一部分。如果你是这种人的话,那…
单曲循环:1.所有神的属性中,我最同情的是:神不能自杀。——芥川龙之介《侏儒的话》 2.从来如此,便对么?——鲁迅《狂人日记》 3.我的不幸乃是一种缺乏拒绝能力的人的不幸。我时常陷入一种恐惧之中,以为如果别人劝我干什么而自己加以拒绝的话,就会在对方的心灵和自己的心灵中剜开一道永远无法修复的裂痕。难道不反抗也是一种罪过吗?——太宰治《人间失格》 4.我既没有愁苦到足以成为诗人,又没有冷漠到像个哲学家。但我清醒到足以成…
3、 会话维持
设想这样一个场景,第一个请求利用 post()方法登录了某个网站,第二次想获取成功登录后的自 己的个人信息,你又用了一次 get()方法去请求个人信息页面。 实际上,这相当于打开了两个浏览器, ·四 是两个完全不相关的会话,能成功获取个人信息吗?那当然不能。 噩噩
有小伙伴可能说了,我在两次请求时设置一样的 cookies 不就行了?可以,但这样做起来显得很 烦琐, 我们有更简单的解决方法 。
其实解决这个问题的主要方法就是维持同一个会话 , 也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。 但是我又不想每次设置 cookies,那该怎么办呢?这时候就有了新的
利器 - Session 对象 。
-- 先说说没有用session的情况
import requests
import re
headers = {
'Cookie':'tgw_l7_route=116a747939468d99065d12a386ab1c5f; _zap=ac5fdb1f-8e53-4d69-a7f4-07a72df1caff; _xsrf=zKMRD5fn7u8DG1Ea6iO2L7PIWWRMnuiW; d_c0="ALDk6-gCAA-PTkVxRo8-KYq-C3MJO-hnkWI=|1550478800"; capsion_ticket="2|1:0|10:1550478875|14:capsion_ticket|44:N2RhNTdlNzUxODA2NGI4M2JiMWU5NmUzZWU0MTVmOTg=|2237d5a4349ae9b52dd4a26b835189f9b897eba8a64410dd7165b1cc5411f5f7"; z_c0="2|1:0|10:1550478919|4:z_c0|92:Mi4xdXpOYkRnQUFBQUFBSU9MZTZBSUFEeVlBQUFCZ0FsVk5SN3hYWFFEWURjb2xNZzdZTlFZRkdQa3luZFlzczl2bEdB|8c000aeb764ed6f142580cf5e7e3767c55b9c8e7b7c6def4d269a2694a4a6b03"; tst=r; q_c1=eb832fa18402482cafc7a8aa538bf33e|1550478920000|1550478920000',
'Host':'www.zhihu.com',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac 05 X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com",headers = headers)
r = requests.get("https://www.zhihu.com")
print(r.text)
上面代码第一个请求是设置了cookie,第二就没有设置了,输出结果是有问题的,提示没有登录,为什么呢,因为其实这相当于两个浏览器发出的请求,虽然第一个设置了cookie,但是第二个没有设置,所以第二个没有访问权限
输出结果:
如果用session就不一样了,headers2里面并没有cookie,但是请求返回正常,说明session已经保存了cookie
import requests
import re
headers = {
'Cookie':'_zap=ac5fdb1f-8e53-4d69-a7f4-07a72df1caff; _xsrf=zKMRD5fn7u8DG1Ea6iO2L7PIWWRMnuiW; d_c0="ALDk6-gCAA-PTkVxRo8-KYq-C3MJO-hnkWI=|1550478800"; capsion_ticket="2|1:0|10:1550478875|14:capsion_ticket|44:N2RhNTdlNzUxODA2NGI4M2JiMWU5NmUzZWU0MTVmOTg=|2237d5a4349ae9b52dd4a26b835189f9b897eba8a64410dd7165b1cc5411f5f7"; z_c0="2|1:0|10:1550478919|4:z_c0|92:Mi4xdXpOYkRnQUFBQUFBSU9MZTZBSUFEeVlBQUFCZ0FsVk5SN3hYWFFEWURjb2xNZzdZTlFZRkdQa3luZFlzczl2bEdB|8c000aeb764ed6f142580cf5e7e3767c55b9c8e7b7c6def4d269a2694a4a6b03"; tst=r; q_c1=eb832fa18402482cafc7a8aa538bf33e|1550478920000|1550478920000',
'Host':'www.zhihu.com',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac 05 X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
// 没有带cookie
headers2 = {
'Host':'www.zhihu.com',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac 05 X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
session = requests.Session()
session.get("https://www.zhihu.com",headers = headers)
print(session.cookies)
// headers2没有设置cookie
r = session.get("https://www.zhihu.com", headers = headers2)
print(r.text)
输出结果:
输出正常,所以说明session里面保存了cookie
4、 身份认证
requests 自带的身份认证功能,示例如下:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get(’http://localhost:sooo', auth=HTTPBasicAuth(’username',’password'))
print(r.status_code)
如果用户名和密码正确的话,请求时就会自动认证成功,会返回 200 状态码 ;如果认证失败, 返回 401状态码。
则 当然 ,如果参数都传一个 HTTPBasicAuth 类,就显得有点烦琐了,所以 requests 提供了 一个更简
单的写法 ,可以直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证 。 所以下面的代码可以直接简写如下 :
import request s
r = requests.get('http:I/localhost:5ooo', auth=(’username' ,’password'))
print(r. status_code)
此外 , requests还提供了其他认证方式,如 OAuth认证 , 不过此时需要安装 oauth包
5、 post请求的param参数
前面介绍 urllib时,我们可以将请求表示为数据结构,其中各个参数都可以通过一个 Request 对 象来表示 。 这在 requests里同样可以做到,这个数据结构就叫 Prepared Request。 我们用实例看一下:
from requests import Request, Session
url = ’ http://httpbin.org/post ’
data = {
'name’: 'germey'
}
headers = {
’User-Agent'; ’Mozilla/s.o (Macintosh; Intel Mac OS X10_11_4) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/53.0.2785.116 Safari/537.36'
s = Session()
req = Request(’ POST’, url, data=data, headers=headers)
prepped = s.prepare request(req)
r = s.send(prepped)
print( r. t e x t )