今天是我实习的第四天,今天我学习了requests库模拟会话,ccokies和session,ü存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这样设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这样设置自动处理就大大免去了重复添加操作。所以对于那些设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。这就是cookies机制。可通过浏览器开发者工具,查看cookies。在浏览器中打开百度,打开开发者工具,选择Application选项卡。在左侧目录树中选择Cookies,就可以查看网站使用的cookie。
而cookies机制
ü
Session
机制是一种
服务器端
的机制,服务器使用一种类似于
散列表
的结构(也可能就是使用散列表)来保存信息。
ü
当程序需要为某个客户端的请求创建一个
Session
时,服务器首先检查这个客户端的请求
(
cookie
)
里是否已包含了一个
Session
标识(称为
Session Id
)
。
如果已包含则说明以前已经为此客户端创建过
Session
,服务器就按照
Session Id
把这个
session
检索出来使用(检索不到,会新建一个)
;
如果客户端请求不包含
Session Id
,则为此客户端创建一个
Session
并且生成一个与此
Session
相关联的
Session id
,
Session Id
的值应该是一个既不会重复,又不容易被找到规律的方式以仿造的字符串,这个
Session Id
将被在本次响应中返回给客户端保存。
ü
cookie
数据存放在客户的浏览器上,
session
数据放在服务器上。
ü
cookie
不是很安全,别人可以分析存放在本地的
cookie
并进行
cookie
欺骗,考虑到安全应当使用
session
。
ü
session
会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用
cookie
。
ü
单个
cookie
保存的数据不能超过
4K
,很多浏览器都限制一个站点最多保存
20
个
cookie
。
ü
可以考虑将登陆信息等重要信息存放为
session
,其他信息如果需要保留,可以放在
cookie
中。
今天我已豆瓣网站为例,登录爬取个人主页简介信息,使用密码登录,观察url地址。
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.41",
"Cookie":"ll='108288'; bid=qR-Kxu85nQc; __utma=30149280.979058670.1752818433.1752818433.1752818433.1; __utmc=30149280; __utmz=30149280.1752818433.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmt=1; user_data={%22area_code%22:%22+86%22%2C%22number%22:%2215144851323%22%2C%22code%22:%229164%22}; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.26386; frodotk_db='782b06c0d1de59ec68811442759b0dc4'; _pk_ref.100001.2fad=%5B%22%22%2C%22%22%2C1752818660%2C%22https%3A%2F%2Fwww.douban.com%2Fpeople%2F2638688%2F%3F_i%3D2818496qR-Kxu8%22%5D; _pk_id.100001.2fad=a3f9a400b4b61078.1752818660.; _pk_ses.100001.2fad=1; vtoken=phone_reset_password%20e835c3e0ce74414fa87bbaf72ea63c15; last_login_way=account; __utmb=30149280.7.10.1752818433; login_start_time=1752818780669"
}
def login():
try:
url = "https://accounts.douban.com/j/mobile/login/basic"
parm = {
"name": "***********",
"password": "*******",
"remember": True
}
s = requests.session()
r = s.post(url, data=parm, headers=headers)
r.raise_for_status()
return s
except Exception as err:
print(err)
def get_html(s, url):
try:
r = s.get(url, headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
print("*******" in r.text)
except Exception as err:
print(err)
if __name__ == "__main__":
session = login() # 登录
print("登录成功!")
url = "https://www.douban.com/people/263868978/"
get_html(session, url) # 获取个人主页
print("获取个人主页成功!")
像这样就可以爬取成功!
接下来我以此代码为例又爬了一下超星学习通个人简介页面,发现同样适用。代码如下:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.41",
"Cookie":"fid=2065; browserLocale=zh_CN; JSESSIONID=9F4BE9113DB6D4A5E8951B096BDEC9CD; route=8dfd6a50c03ca82e777f6652212cd1; retainlogin=2; source="}
def login():
try:
url = "https://i.chaoxing.com/base"
parm = {
"name": "*********",
"password": "***********",
"remember": True
}
s = requests.session()
r = s.post(url, data=parm, headers=headers)
r.raise_for_status()
return s
except Exception as err:
print(err)
def get_html(s, url):
try:
r = s.get(url, headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
print("**" in r.text)
except Exception as err:
print(err)
if __name__ == "__main__":
session = login() # 登录
print("登录成功!")
url = "https://passport2.chaoxing.com/fanyalogin"
get_html(session, url) # 获取个人主页
print("获取个人主页成功!")






