cookie处理
cookie状态管理
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。
怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。
这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理
Cookie和Session都用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题所做的努力。
对于爬虫开发来说,我们更加关注的是Cookie,因为Cookie将状态保存在客户端,Session将状态保存在服务器端
Cookie实际上是一小段的文本信息
Cookie是服务器在本地机器(客户端)上存储的小段文本并随每一个请求发送至同一个服务器。
网络服务器用HTTP头向客户端发送Cookie,浏览器则会解析这些Cookie并将它们保存为一个本地文件,它会自动将同一服务器的任何请求绑定上这些Cookie
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
服务器还可以根据需要修改Cookie的内容。
Session是另一种记录客户状态的机制
Cookie的工作方式:服务器给每个Session分配一个唯一的JESSION-ID,并通过Cookie发送给客户端。
当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session
不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。
Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了
Cookie处理
在爬虫的时候,经常进行模拟登陆和访问,这时我们需要使用http.cookjar和url.request这两个模块
其中只要使用url.cookjar中的CookieJar类,以及url.request中的HTTPCookieProcessor方法
http.cookjar 模块: 主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handle对象
CookieJar类有一些子类,分别是FileCookieJar,MozillaCookieJar,LWPCookieJar
-
CookieJar:管理HTTP cookie值、它从HTTP请求中提取cookie并存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失
-
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据
-
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例
-
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例
其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()
使用CookieJar获取cookie值
访问百度首页,获取访问的cookie
import urllib.request
import http.cookiejar
# 构建一个CookieJar对象实例来保存cookie
cookiejar = http.cookiejar.CookieJar()
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)
# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)
# 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
opener.open("http://www.baidu.com")
# 可以按标准格式将保存的cookie打印出来
cookieStr = ''
for item in cookiejar:
cookieStr = cookieStr + item.name + "=" + item.value + ";"
print(item.name + "=" + item.value)
# 打印,并去掉最后一位分号
print(cookieStr[:-1])
BAIDUID=EEA33F1762D871142160C26E81F29657:FG=1
BIDUPSID=EEA33F1762D87114A289C35D98848E9C
H_PS_PSSID=33425_33514_33582_33272_31254_33338_26350_22160
PSTM=1613273571
BDSVRTM=0
BD_HOME=1
BAIDUID=EEA33F1762D871142160C26E81F29657:FG=1;BIDUPSID=EEA33F1762D87114A289C35D98848E9C;H_PS_PSSID=33425_33514_33582_33272_31254_33338_26350_22160;PSTM=1613273571;BDSVRTM=0;BD_HOME=1
获取网站的cookie并保存cookie到文件中
import urllib.request
import http.cookiejar
url = "http://www.baidu.com"
# 保存cookie的一个文件
cookie_filename = "cookie.txt"
# 声明一个MozillaCookieJar(文件对象)对象实例来保存cookie,之后写入文件
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)
# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)
# 创建一个请求,原理同urlopen
response = opener.open(url)
# 可以按标准格式将保存的cookie打印出来
cookieStr = ''
for item in cookiejar:
cookieStr = cookieStr + item.name + "=" + item.value + ";"
print(item.name + "=" + item.value)
# 打印,并去掉最后一位分号
print(cookieStr[:-1])
# 保存cookie到文件
cookiejar.save()
从文件中获取cookies,做为请求的一部分
从文件中获取cookies,做为请求的一部分去访问网站
import urllib.request
import http.cookiejar
url = "http://www.baidu.com"
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
headers = {"User-Agent" : user_agent, "Connection" : "keep-alive"}
# 保存cookie的一个文件
cookie_filename = "cookie.txt"
# 声明一个MozillaCookieJar(文件对象)对象
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)
print(cookiejar)
# 从文件中读取cookie内容到变量
cookiejar.load(cookie_filename)
print(cookiejar)
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)
# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)
# 创建一个请求
get_request = urllib.request.Request(url, headers=headers)
# 原理同urlopen
response = opener.open(get_request)
登录csdn,并保存cookie到文件中,再从文件中读取cookie访问CSDN其他页面
import urllib.request, urllib.parse, urllib.error
import http.cookiejar
login_url = "https://passport.csdn.net/account/login"
login_user = {"username": "Python_requests", "password": "123456"}
postdata = urllib.parse.urlencode(login_user).encode("utf-8")
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
headers = {"User-Agent": user_agent, "Connection": "keep-alive"}
# 保存cookie的一个文件
cookie_filename = "cookie.txt"
# 声明一个MozillaCookieJar(文件对象)对象
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)
# 从文件中读取cookie内容到变量
# cookiejar.load(cookie_filename)
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)
# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)
# 创建一个请求
get_request = urllib.request.Request(login_url, postdata, headers=headers)
try:
response = opener.open(get_request)
page = response.read().decode("utf-8")
print(page)
except urllib.error.URLError as e:
print(e.code, ":", e.reason)
# 保存cookie到cookie.txt中
cookiejar.save()
import urllib.request, urllib.parse, urllib.error
import http.cookiejar
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
headers = {"User-Agent" : user_agent, "Connection" : "keep-alive"}
cookie_filename = "cookie.txt"
cookie= http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
get_url = "https://mp.csdn.net/mdeditor/83214161#"
get_request = urllib.request.Request(get_url, headers=headers)
get_response = opener.open(get_request)
print(get_response.read().decode("utf-8"))
转载于:https://blog.csdn.net/UserPython/article/details/83214161