发送POST请求
哪些地方我们会遇到POST请求:
- 登录注册(post比get安全)
- 需要传输大文本的时候(POST请求对数据长度没有要求)
爬虫也需要在这两个地⽅模拟浏览器发送post请求。
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
data = {
'from':'en',
'to':'zh',
'query':'hello',
'transtype': realtime',
'simple_means_flag': 3',
'sign': '679849.965784',
}
post_url = 'https://xxx.com'
r = requests.post(post_url,data=post_data,headers=headers)
print(r.txex)
使用代理
问题:为什么爬⾍需要使⽤代理
- 让服务器以为不是同⼀个客户端在请求
- 防⽌我们的真实地址被泄露,防⽌被追究
proxies = {
‘http’:‘http://12.34.56.79:9527’,
‘https’:‘http://12.34.56.79:9527’
}
用法:
requests.get('http://www.baidu.com',proxies = proxies)
案例:
import requests
proxies = {'http':'http://117.191.11.112'}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
r = requests.get('http://www.baidu.com',proxies = proxies,headers = headers}
print(r.status_code)
怎样使用代理IP
准备⼀堆的IP地址,组成IP池,随机选择⼀个IP来⽤
检查IP的可⽤性
1.可以使⽤requests检查
2.在线代理IP质量检查的⽹站
cookie和session区别
- cookie数据存放在客户端的浏览器上,session数据放在服务器上。
- cookie不是很安全,别⼈可以分析存放在本地的cookie并进⾏cookie欺骗。
- session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制⼀个站点最多保存20个cookie。
爬虫处理cookie和session
带上cookie、session的好处:能够请求到登录之后的页面。
带上cookie、session的弊端:⼀套cookie和session往往和⼀个⽤户对应请求太多,请求次数太多,容易被服务器识别为爬⾍。
不需要cookie的时候尽量不去使⽤cookie
但是为了获取登录之后的⻚⾯,我们必须发送带有cookies的请求
requests提供了⼀个叫做session类,来实现客户端和服务端的会话保持。
使用方法
- 实例化session
- 先使⽤session发送请求,登录对应⽹站,把cookie保持在session中
- 在使⽤session请求登录之后才能访问的⽹站,session能够⾃动携带登录成功时保存在其中的cookie,进⾏请求。
import requests
session = requests.session()
post_url = "******.com"
post_data = {'email':'----@qq.com','password':''}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
# 使⽤session发送post请求,cookie保存在其中
session.post(post_url,data=post_data,headers=headers)
# 使⽤session进程请求登录之后才能访问的地址
response = session.get('.......', headers=header)
with open('renren.html', 'w', encoding='utf-8') as f:
f.write(response.text)