我们在使用爬虫的时候,经常会用到cookie进行模拟登陆和访问。在使用urllib库做爬虫,我们需要借助http.cookiejar库中的CookieJar来实现。
CookieJar类有一些子类,分别是FileCookieJar,MozillaCookieJar,LWPCookieJar。
CookieJar:管理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()。
当然,如果我们对cookie有定制的需要,那么我们也要借助HTTPCookieProcess处理器来处理。
import urllib
import urllib.request
import http.cookiejar as cookiejar
import urllib.parse
# 创建cookiejar对象,保存访问网络的cookie
cookie = cookiejar.CookieJar()
# HttpCookieProcessor ----->Handler
# HttpHandler ProxyHandler
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
# 使用handler创建Opener
opener = urllib.request.build_opener(cookie_handler)
# 豆瓣网页
# 登录POSRT
url = 'https://www.douban.com/accounts/login'
# form表单
'''
source=index_nav&form_email=18513106743&form_password=31415926abc'''
url_person = 'https://www.douban.com/people/164698173/'
# 全局安装,urllib.request.urlopen === 使用opener
urllib.request.install_opener(opener)
# 第一次请求登录获取cookier
params = {'source':'index_nav',
'form_email':'12234543221',
'form_password':'31415926abc'}
params = urllib.parse.urlencode(params).encode('utf-8')
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}
request = urllib.request.Request(url=url,data = params,headers=headers)
urllib.request.urlopen(request)
# 第二次获取个人主页,get请求
response = urllib.request.urlopen(url=url_person)
print(response.read().decode('utf-8'))
import requests
# 对于urllib 验证需要
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
# 豆瓣
url = 'https://www.douban.com/accounts/login'
# form表单
'''
source=index_nav&form_email=1106743&form_password=31415926abc'''
url_person = 'https://www.douban.com/people/164698173/'
# 第一次请求登录获取cookier
params = {'source':'index_nav',
'form_email':'1106743',
'form_password':'31415926abc'}
# 会话在自己生命周期之内,多次进行网络请求,自动记录cookie
session = requests.Session()
# 第一步请求,登录
# 对于requests 模块,不需要urlencode
session.post(url=url,data=params,verify = False)
# 第二步,获取豆瓣,个人主页信息
response = session.get(url=url_person,verify = False)
response.encoding = 'utf-8'
print(response.text)