一、cookie处理
当我们爬取网页中的数据时,大多数网站都是需要登陆的,登陆时输入的信息会被存储在cookie中。如果我们想要获取一些登录后才有的信息,我们必须要用到cookie。本文主要讲cookie和代理理论,至于在登陆过程中碰到需要输入验证码的问题在另一篇文章中单独讲解。
假设,我们现在想要爬取登陆后个人信息,由于http/https协议特性:无状态,发起的第二次基于个人主页页面请求的时候,服务器端并不知道该此请求是基于登录状态下的请求。因此使用cookie,用来让服务器端记录客户端的相关状态。
cookie有两种处理手段:
- 手动处理:通过抓包工具获取cookie值,将该值封装到headers中。(不建议)
- 自动处理:由于有的cookie有有效时长,是动态变化的,手动处理通用性不强,因此建议采用自动处理。
cookie值的来源:模拟登录post请求后,由服务器端创建。
session会话对象:
- 作用:
1.可以进行请求的发送。
2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中。
- 创建一个session对象:session = requests.Session()
- 使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
- session对象对个人主页对应的get请求进行发送(携带了cookie)
使用session就相当于替换了requests,原理都没有变,只不过session携带了cookie,就不用在headers中添加cookie了。
# 这里只展示了部分代码,关于session操作的,具体登录细节并没有实现
# 请仔细看session的post请求和get请求即可。
#post请求的发送(模拟登录)
#创建一个session对象
session = requests.Session()
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019431046983'
data = {
'email': 'www.zhangbowudi@qq.com',
'icode': result,
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password': '06768edabba49f5f6b762240b311ae5bfa4bcce70627231dd1f08b9c7c6f4375',
'rkey': '3d1f9abdaae1f018a49d38069fe743c8',
'f':'',
}
#使用session进行post请求的发送
response = session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
#爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/289676607/profile'
#手动cookie处理
# headers = {
# 'Cookie':'xxxx'
# }
#使用携带cookie的session进行get请求的发送
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('bobo.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
二、代理理论
代理就是代理服务器,在本机和服务器之间构建一个桥梁,本机先将请求发送给代理服务器,再由代理服务器发送给真正的服务器。
某些网站会检测IP单位时间内请求的次数,超过一定次数会被封IP,这也是一种反爬机制。代理就是为了破解这种反爬机制的一种策略。
①代理的作用:
- 突破自身IP访问的限制。
- 隐藏自身真实IP。
②代理相关的网站:
- 快代理
- 西祠代理
- www.goubanjia.com
③代理ip的类型:
- http:应用到http协议对应的url中
- https:应用到https协议对应的url中
④代理ip的匿名度:
- 透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
- 匿名:知道使用了代理,不知道真实ip
- 高匿:不知道使用了代理,更不知道真实的ip
在百度中搜索ip,就可以看到自己的ip地址。下面通过编码来更改发送请求的ip地址。
这里我们使用第三个代理网站。
import requests
# url = 'https://www.baidu.com/s?wd=ip'
url = 'http://www.httpbin.org/ip'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
response = requests.get(url=url,headers=headers,proxies={"http":"http://106.42.216.62:9999"})
response.encoding = 'utf-8'
page_text = response.text
with open('ip.html','w',encoding='utf-8') as fp:
fp.write(page_text)
注意,http协议就要用http代理,https协议就要用https代理。
如果连接失败,就是如下的样子,如果连接成功,点开保存的网页,会产生代理服务器的ip地址。