欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫用session携带cookie进行模拟登录(最简单基础的小例子)

程序员文章站 2022-05-28 16:12:35
...

Python爬虫用session携带cookie进行模拟登录

首先进行模拟登录,爬取基于某些用户的用户信息。对正点原子网站进行模拟登录,在输入账号和密码登录之前,在登录界面点击审查元素,点击Network,勾选Preserve log,然后输入账号和密码登录,审查元素界面的Network会更新,点击login查看。

import requests
from lxml import etree

headers = {
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#使用post请求的发送
login_url = 'http://www.openedv.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'
data = {
       'username': '[email protected]',
       'password': 'abc235711',
       'quickforward': 'yes',
       'handlekey': 'ls'
}

response = requests.post(url=login_url,headers=headers,data=data)
print(response.status_code)
login_page_text = response.text
with open('./openedv_mocklogin.html','w',encoding='gbk') as fp:
    fp.write(login_page_text)

模拟登录之后,用requests.get()方法爬取用户我的帖子界面。

import requests
from lxml import etree

headers = {
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#使用post请求的发送
login_url = 'http://www.openedv.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'
data = {
       'username': '[email protected]',
       'password': 'abc235711',
       'quickforward': 'yes',
       'handlekey': 'ls'
}

response = requests.post(url=login_url,headers=headers,data=data)
print(response.status_code)
login_page_text = response.text
#我的帖子界面的url
detail_url = 'http://www.openedv.com/forum.php?mod=guide&view=my'
detail_page_text = requests.get(url=detail_url,headers=headers).text
with open('./openedv_mytiezi.html','w',encoding='gbk') as fp:
    fp.write(detail_page_text)

执行完代码之后,打开openedv_mytiezi.html,发现不能够访问我的帖子界面,显示的是“您需要先登录才能继续本操作”。
模拟登录之后爬取用户信息失败的原因:http/https协议特性是无状态,发起的第二次基于个人主页页面请求的时候,服务器端并不知道该次请求是基于登录状态下的请求。
cookie:用来让服务器端记录客户端的相关状态。
cookie值的来源:模拟登录post请求后,由服务器端创建。
session会话对象:可以进行请求的发送,如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中。
使用session进行模拟登录的流程:创建一个session对象:session = requests.Session(),使用session对象进行模拟登录post请求的发送(cookie会被存储在session中),session对象对个人主页对应的get请求进行发送(携带了cookie)。

import requests
from lxml import etree

headers = {
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
login_url = 'http://www.openedv.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'
data = {
       'username': '[email protected]',
       'password': 'abc235711',
       'quickforward': 'yes',
       'handlekey': 'ls'
}
#创建一个session对象
session = requests.Session()
#使用session进行post请求的发送
response = session.post(url=login_url,headers=headers,data=data)
print(response.status_code)

#爬取用户我的帖子界面
detail_url = 'http://www.openedv.com/forum.php?mod=guide&view=my'
#使用携带了cookie的session进行get请求的发送
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('./openedv_mytiezi_cookie.html','w',encoding='gbk') as fp:
    fp.write(detail_page_text)

执行完代码之后,打开openedv_mytiezi_cookie.html,发现能够正常地访问我的帖子界面。