爬虫之——初识cookie
什么是cookie?
在网站中,http的请求是无状态的。也就是说即使第一次和服务器连接后并登录成功后,发出第二次请求的时候,服务器依然不知道当前请求是哪个用户。cookie的出现就是为了解决这个问题。第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动地携带给服务器,服务器通过浏览器携带的数据就能判断当前的数据是哪一个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些少量的数据。
cookie的格式
Set-Cookie:NAME=VALUE:Expires/Max-age-DATE:Path=PATH:Domain=DOMAIN_NAME:SECURE
参数的意义:
- NAME:cookie的名字。
- VALUE:cookie的值。
- Expires:cookie的过期时间。
- Path:coolie作用的路径。
- Domain:cookie作用的域名。
- SECURE:是否只在https协议下起作用。
1.使用cookielib库和HTTPCookieProcessor模拟登录【暴力登录法】
cookie可以保持登录信息到用户下次与服务器的会话。
from urllib import request
url="http://www.renren.com/880151247/profile"
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Cookie":"登录人人网后-访问目标主页的cookie"}
req=request.Request(url=url,headers=headers)
resp=request.urlopen(req)
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
为什么称为暴力登录法呢?
因为该方法每次使用时,必须要到目标网页复制cookie。
2.使用http.cookiejar实现自动化登录
该模块主要的类有CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar。这四个类的作用分别如下:
- CookieJar:管理HTTPcookie值,存储HTTP请求生成cookie,向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
- FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
- MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器cookie.txt兼容的FileCookieJar实例。
- LWPCookieJar:从FileCookieJar派生而来,创建与libwww.per标准的Set-Cookie3文件格式兼容的FileCookieJar实例。
利用http.cookiejar和request.HTTPCookieProcessor登录人人网,相关示例如下:
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
# 1.登录
def get_opener():
# 1.1.创建一个cookiejar对象
cookiejar=CookieJar()
# 1.2.使用cookiejar创建一个HTTPCookieProcessor对象
handler=request.HTTPCookieProcessor(cookiejar)
# 1.3使用上一步创建的handler创建一个opener
opener=request.build_opener(handler)
return opener
def login(opener):
# 1.4使用opener发送登录的请求
data={
'email':"人人网用户的邮箱账号",
'password':"密码"
}
login_url="http://www.renren.com/PLogin.do"
req=request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req)
#2.访问主页
def visit(opener):
url="http://www.renren.com/880151247/profile"
#获取个人主页页面的时候,不要新建一个opener,应该使用之前的饿opener,因为它已经包含了之前的opener
resp=opener.open(url)
req=request.Request(url,headers=headers)
resp=opener.open(req)
with open("renren5.html",'w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
if __name__ == '__main__':
opener=get_opener()
login(opener)
visit(opener)
3.cookie信息的保存与加载
保存
将cookie保存到本地可以使用cookiejar的save方法。【使用前提:指定一个文件名】
指定当前目录下的cookiejar.txt为存储位置
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://www.baidu.com/')
#如果前方没有指定存储的文件的话,在save的参数中需要写上指定的文件名称
cookiejar.save()
通过上述的操作,我们可以获取到百度的cookie
####修改/设置cookie
我们可以通过地址栏设置cookie:
http://httpbin.org/cookies/set?course=spider
当前浏览器关闭,则现有的cookie均过期。而这个放在程序中的体现就是当程序运行结束后,cookie过期。故要想通过代码的形式保存cookie,需要在save方法中添加参数“ignore_discard=True"。这样可以实现即将过期的cookie的信息存储。
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://www.baidu.com/')
cookiejar.save()
resp=opener.open('http://httpbin.org/cookies/set?course=aha')
cookiejar.save(ignore_discard=True)
加载
如果浏览器已经关闭或设置cookie的程序已经结束,则需要在load方法中设置“ignore_discard=True”,来加载过期的cookie信息
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
#加载已经过期的cookie信息
cookiejar.load(ignore_discard=True)
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:
print(cookie)
小曦有话说:如果准备使用爬虫爬取网页内容,一定的web知识必不可少呦。本篇文章的内容为学习https://www.bilibili.com/video/BV1aJ411C7oM?from=search&seid=11265456435626878235系列的笔记