requests的简单使用

requests中如何解决乱码

为什么会出现乱码:python解码和请求的网页编码不一样

1.response.content.decode('utf-8')
2.response.encoding = 'utf-8'
  response.text

response.text和response.content的区别

response.text
类型:str
修改编码⽅式:response.encoding = ‘utf-8’
适用范围:文本

response.content
类型:bytes
修改编码⽅式:response.content.decode(‘utf-8’)
适用范围: 图片 音频

下载图片

import requests

response = request.get(''https://www.baidu.com/img/bd_logo1.png?where=su)

with open('baidu.png', 'wb') as f:
	f.write(response.content)

'wb’是方法 b是字节的意思
response.content 保存的形式是字节

发送带header的请求

为什么请求需要带上header?
模拟浏览器,欺骗服务器,获取和浏览器⼀致的内容

1 header的形式:字典
2
3 headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
4
5 ⽤法:requests.get(url,headers = headers)

发送带参数的请求

1 http://www.webkaka.com/tuo/server/2015/1119
2 https://www.baidu.com/s?wd=python&c=b
3
4 参数的形式:字典
5
6 kw = {'wd':'python'}
7 ⽤法:requests.get(url,params=kw)

https://www.baidu.com/s?wd=python加上参数会变成https://www.baidu.com/s?wd=python&wd=python,不影响请求
https://www.baidu.com/s?wd=python 可以出掉?requests请求是会自动加上

发送post请求

哪些地⽅我们会⽤到POST请求:
1 登录注册(post⽐get安全)
2 需要传输⼤⽂本的时候(POST请求对数据⻓度没有要求)
爬⾍也需要在这两个地⽅模拟浏览器发送post请求

1 ⽤法:
2 response = requests.post("http://www.baidu.com/",data=data,headers=heade)
data是参数,以字典的形式

使用代理IP

问题:为什么爬⾍需要使⽤代理
1 让服务器以为不是同⼀个客户端在请求
2 防⽌我们的真实地址被泄露,防⽌被追究

使用的时候可以准备一个ip代理池,使用前要检查可用性
1.可以使⽤requests检查
2.在线代理IP质量检查的⽹站

1 ⽤法:requests.get('http://www.baidu.com',proxies = proxies)
2
3 proxies的形式:字典
4
5 proxies = {
6 'http':'http://12.34.56.79:9527',
7 'https':'http://12.34.56.79:9527',
8 }

案例

1 import requests
2
3 proxies = {'http':'http://117.191.11.112'} 可以放入多条IP
4
5 headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
6
7 r = requests.get('http://www.baidu.com',proxies = proxies,headers = headers)
8
9 print(r.status_code)

cookie和session区别

1.cookie数据存放在客户端的浏览器上,session数据放在服务器上。
2.cookie不是很安全,别⼈可以分析存放在本地的cookie并进⾏cookie欺骗
3.session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能
4.单个cookie保存的数据不能超过4K,很多浏览器都限制⼀个站点最多保存20个cookie

爬⾍处理cookie和session

1.带上cookie、session的好处:能够请求到登录之后的⻚⾯
2.带上cookie、session的弊端:⼀套cookie和session往往和⼀个⽤户对应请求太多,请求次数太多,容易被服务器识别为爬⾍
3.不需要cookie的时候尽量不去使⽤cookie但是为了获取登录之后的⻚⾯,我们必须发送带有cookies的请求

1 requests提供了⼀个叫做session类,来实现客户端和服务端的会话保持
2
3 使⽤⽅法
4 实例化⼀个session对象
5
6 让session发送get或者post请求
7
8 session = requests.session()
9 response = session.get(url,headers)

请求登录之后的⽹站的思路:

1 实例化session
2 先使⽤session发送请求,登录对应⽹站,把cookie保持在session中
3 在使⽤session请求登录之后才能访问的⽹站,session能够⾃动携带登录成功时保存在其中的cookie,进⾏请求

登入人人网
1 import requests
2
3 session = requests.session()
4
5 post_url = "http://www.renren.com/PLogin.do"
6
7 post_data = {'email':'844297347@qq.com','password':''}
8
9 headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6
10
11
12 session.post(post_url,data=post_data,headers=headers)
13
14 r = session.get('http://www.renren.com/474133869/profile',headers = headers)
15
16 with open('renren.html','w') as f:
17 f.write(r.text)

不发送post请求,使⽤cookie获取登录后的⻚⾯

1.cookie过期时间很⻓的⽹站
2.在cookie过期之前能够拿到所有的数据,
3.配合其他程序⼀起使⽤,其他程序专⻔获取cookie,当前程序专⻔请求⻚⾯

1 import requests
2
3 headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6
4
5 cookie = 'anonymid=joodgrmgdmis8y; depovince=GW; _r01_=1; JSESSIONID=ab
6
7 cookie = {i.split("=")[0]:i.split("=")[1] for i in cookie.split("; ")}
8 # 使⽤session进程请求登录之后才能访问的地址
9 r = requests.get('http://www.renren.com/474133869/profile',headers = headers)
10
11 with open('renren2.html','w') as f:
12 f.write(r.text)

requests小技巧

1.requests.utils.dict_from_cookiejar 把cookie对象转化为字典

import requests
response = requests.get('htttps://www.baidu.com/')
requests.utils.dict_from_cookiejar(response.cookies)

2 请求SSL证书验证

response = requests.get('https://www.12306.cn/index/',verify=False)

3 设置超时

1 response = requests.get(url,timeout=10)

4 配合状态码判断是否请求成功

1 assert response.status_code == 200

报错会出现 AssertionError 代码
5.URL地址的编解码

1 requests.utils.unquote() 解码
2 requests.utils.quote() 编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值