Python爬虫_Cookie

版权声明:由于作者水平有限,文中难免有误,欢迎各位业界同仁斧正! https://blog.csdn.net/UserPython/article/details/83214161

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.cookjarurl.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])

我们使用以上方法将cookie保存到cookiejar对象中,然后打印cookie中的值,也就是访问百度首页的cookie。运行结果如下:

BAIDUID=150A89F7FD794CB06CD74D08DA0E8AA7:FG=1
BIDUPSID=150A89F7FD794CB06CD74D08DA0E8AA7
H_PS_PSSID=26522_1464_21114_26350_22073
PSTM=1540024558
delPer=0
BDSVRTM=0
BD_HOME=0
BAIDUID=150A89F7FD794CB06CD74D08DA0E8AA7:FG=1;BIDUPSID=150A89F7FD794CB06CD74D08DA0E8AA7;H_PS_PSSID=26522_1464_21114_26350_22073;PSTM=1540024558;delPer=0;BDSVRTM=0;BD_HOME=0

获取网站的cookie并保存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":"UserPython", "password" : "passpw"}
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"))

猜你喜欢

转载自blog.csdn.net/UserPython/article/details/83214161