python爬虫学习笔记及随堂练习--cookie模拟登录
一、前言
此代码是学习波波老师python爬虫教学视频时课堂笔记及随堂练习
对应视频: 波波老师B站视频[P36] 对应up为:路飞学城IT
笔记概要:
使用cookie模拟登陆并爬取登陆后的页面。
额外感谢:
崔庆才大佬提供的一个免费练习爬虫的平台,里面提供网站练习各种爬虫的应用。
地址: 崔庆才大佬的爬取中心
二、笔记
http/https协议特性:无状态
get、request没有请求到对应页面数据的原因:
发起的第二次基于个人主页页面请求的时候,服务器并不知道此请求是基于登录状态下的请求。
cookie:用来让服务器端记录客户端的相关状态。
- 手动处理:通过抓包工具获取cookie值,将该值封装到headers
- 自动处理:
- cookie值的来源
模拟登录post请求后,由服务器端创建- session会话对象:
- 作用:
- 可以进行请求的发送
- 如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
- 步骤:
- 创建一个session对象:session = requests.Session()
- 使用session对象进行模拟登陆post请求的发送(cookie就会被存储在session中)
- session对象对个人主页对应的get请求进行发送(携带了cookie)
二、代码
1. 直接用request不使用cookie,结果不能获取登录后页面
import requests
def main():
headers = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64;x64;rv: 84.0) Gecko / 20100101 Firefox / 84.0"
}
login_url = 'https://login2.scrape.center/login?next=/' #登录界面
data = {
'username':"admin",
'password':"admin",
}
response = request.post(url=login_url, headers=headers, data=data).text
print(response.status_code)
detail_url = 'https://login2.scrape.center/' #登录后应该显示的界面
detail_page_text = request.get(url=detail_url, headers=headers, data=data).text
with open('scrape.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
if __name__ == '__main__':
main()
print('over')
2. 使用session进行cookie模拟登陆
import requests
def main():
#创建一个session对象
session = requests.Session()
headers = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64;x64;rv: 84.0) Gecko / 20100101 Firefox / 84.0"
}
login_url = 'https://login2.scrape.center/login?next=/' #登录界面
data = {
'username':"admin",
'password':"admin",
}
response = session.post(url=login_url, headers=headers, data=data).text
#print(response.status_code)
# 爬取登录后网页
detail_url = 'https://login2.scrape.center/' #登录后界面
#手动cookie处理
#headers = {
# 'Cookie':'UM_distinctid=17767875766571-0f0e0fcaa08d33-4c3f217f-1fa400-177678757671bf; sessionid=rgynmjenwdpnqtcerhe29qr079bedww4'
#}
#自动cookie处理,前面需要有第一次post登录,使session存储cookie
detail_page_text = session.get(url=detail_url, headers=headers, data=data).text
with open('scrape.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
if __name__ == '__main__':
main()
print('over')
结语
如果对代码有疑问或其他问题,欢迎评论告诉我,我会常来看 (毕竟面向CSDN编程) 。我也是一个刚刚学习python的新手,欢迎大家一起讨论,共同进步。顺便给大家拜个早年,祝牛年大吉。